After our Unity runtime SpriteSheets generator, it is a good idea to optimize the generated pngs files.
pngquant is a command-line utility and a library for lossy compression of PNG images. The conversion reduces file sizes significantly (often as much as 70%) and preserves full alpha transparency. In other words this is a must have tool if you’re working with many pngs!
I used many times pngquant directly from the command line, but depending your project, you might need to run it directly inside your application! I didn’t find example for doing this, and it was way harder than I thought due to my lack of knowledge with batch and shell scripts! So here we go:
We use custom batch file (for Windows) and shell script (for Mac OS X) for launching pngquant. It will take the path to pngs to compress and overwrite them.
OS X:
#!/bin/sh
#!/usr/bin/env bash
#$ -N $2
DIR="$( cd "$( dirname "$0" )" && pwd )"
(cd "$DIR" && ./pngquant -f --ext .png "$1"/*.png)
Windows:
cd %~dp0
pngquant -f --ext .png "%~1"/*.png
Now a C# example for calling thoses scripts, note it works fine with Unity too:
System.Diagnostics.Process process = new System.Diagnostics.Process();
string exec = "";
if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer)
exec = "pngquant-windows.cmd";
else if (Application.platform == RuntimePlatform.OSXEditor || Application.platform == RuntimePlatform.OSXPlayer)
exec = "pngquant-osx";
else
throw new Exception("Platform not supported");
process.StartInfo.FileName = Application.dataPath + "/../../" + exec;
process.StartInfo.Arguments = Application.dataPath + "/../../png-to-compress";
// if your path have blank spaces use:
//process.StartInfo.Arguments = "\"" + Application.dataPath + "/../../png compress\"";
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.Start();
And finally an example with AS3 for AIR:
var process:NativeProcess = new NativeProcess();
var startupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
var file:File = File.applicationDirectory;
var exec:String = "";
if (Capabilities.os.indexOf("Windows") >= 0)
exec = "pngquant-windows.cmd";
else if (Capabilities.os.indexOf("Mac") >= 0)
exec = "pngquant-osx";
else
throw new Error("doesn't work on " + Capabilities.os + " operating system");
file.nativePath = file.nativePath + "/../" + exec;
startupInfo.executable = file;
var processArgs:Vector.<String> = new Vector.<String>();
processArgs[0] = File.applicationDirectory.nativePath + "/../png-to-compress";
startupInfo.arguments = processArgs;
process.start(startupInfo);
Be sure to have a look to PngQuantNativeProcess’s git repository to be up to date!