[vox-tech] PNG tweaking - how to 'kill' RGB in 100% transparent pixels

Jonathan Stickel jjstickel at sbcglobal.net
Sun Mar 5 16:16:43 PST 2006


Have you looked at ImageMagick's "convert" utility?  It is a fairly 
powerful tool with many options.  As a brute-force method, converting to 
some format that doesn't support transparency, and then back again, 
might work for you.

Jonathan


Bill Kendrick wrote:
> So I've got 355-and-counting PNG images in Tux Paint's 'stamps' collection.
> 
> Many of these were photos which were resized, and had the backgrounds
> removed (using the Eraser and selection tools in The GIMP), and then saved
> as RGBA PNG files.
> 
> By default, I GIMP saves PNGs with the following option set:
> "Save color values from transparent pixels."
> 
> This is nice for editing later, since you can use the Eraser tool
> in 'Anti-erase' mode, to bring those pixels page.
> (In other words, when erasing, Gimp doesn't touch the RGB channels, just
> the Alpha channel.  A solid erase simply makes Alpha 0.  Anti-erase brings
> it back to 255.)
> 
> However, this is NOT nice when you no longer care about the erased pixels,
> as it just ends up being wasted space in the PNG.  By that I mean the PNG
> compression is wasting its time and energy (and disk space) worrying about
> the RGB channels of pixels which are 100% transparent.
> 
> If it were a solid color, it would compress a lot more.
> (I believe Gimp uses its, or the PNG's, "background" color when you
> uncheck the "Save color values from transparent pixels" option.)
> 
> 
> While I could simply load up all 355 PNGs into The GIMP and resave
> them one by one -- making sure the "Save color values..." is unchecked --
> that would take a long time.  Additionally, since the project is growing,
> and I don't really feel like keeping track of which PNGs are "golden",
> 
> I was hoping to make a script that I could run on occasion (say, before
> release, or after adding a batch of new PNGs).  My initial thought was
> to use "pngcrush."
> 
> I have one immediate problem.  Debian/sid's pngcrush is currently b0rked:
> 
>   Warning: versions are different between png.h and png.c
>     png.h version: 1.2.7
>     png.c version: 1.2.8
>   [...]
>   pngcrush: relocation error: pngcrush: symbol png_read_data, version PNG12_0
>   not defined in file libpng12.so.0 with link time reference
> 
> 
> Worse, though, is that "pngcrush" on a Debian/stable machine I have
> access to doesn't seem to actually remove the 100% transparent pixels,
> nor do I see any obvious means by which to do so.  (The best crushing
> I get on "stamps/animals/birds/ostrich.png" is 0.17%, if I recall correctly.)
> 
> 
> NetPBM is pretty useless to me for this problem, since the PPM format
> doesn't support Alpha -- it's only RGB.  ImageMagick's "convert" didn't
> seem useful, either.
> 
> Aside from writing my own C app that loads a PNG and then rewrites it
> (altering the RGB to some solid color for every 100% transparent pixel),
> does anyone out here have any suggestions?
> 
> (I'm not against writing my own C app, but... if it's been done already,
> why bother? ;^) )
> 
> Thanks!!!
> 


More information about the vox-tech mailing list