[Image-SIG] PIL PNG encoding performance

Oliver Tonnhofer olt at bogosoft.com
Thu Mar 4 14:31:02 CET 2010


Hi,

I found out that the default PNG(ZIP) encoding options do not offer  
the best performance and output sizes. At least for "vector" images  
like street maps.
I changed the options of deflateInit2 in ZipEncode.c and tested the  
performance of Z_FILTERED, Z_DEFAULT_STRATEGY, Z_HUFFMAN_ONLY and  
Z_RLE and I tested different compression levels for some of the  
strategies.

I found out that Z_RLE offers the best performance while offering good  
compression, at least for my test image.

I tested with timeit.
-----
t = timeit.Timer("img.save('/dev/null', 'png')",
	"import Image; img = Image.open('test.png')")
print name, min(t.repeat(3, 10)),
-----

Here are my raw results, together with the resulting file size.
default0 is the Z_DEFAULT_STRATEGY with compression level 0, etc.

default   0.785417079926 296276
default0  0.171308040619 974861
default1  0.356842041016 323340
default3  0.441128969193 310072
default5  0.562795162201 298403
default7  0.990942001343 295061
default9  7.42386984825  289238
huffman   0.482778072357 409161
huffman1  0.450232982635 409161
filtered  0.821682929993 307535
filtered1 0.360295057297 323340
rle       0.341444015503 307691

For comparison the same tests as JPEG with different quality levels.

jpeg 0.515193939209 181315
jpeg85 0.553126096725 243813
jpeg90 0.587316989899 305299
jpeg95 0.649972915649 431085
jpeg98 0.728760004044 602096
jpeg99 0.771711111069 718724

I really would like to have more options in Image.save to choose  
different compression levels/strategies. I would like to add that to  
PIL and have some questions on how to add that.

At the moment save for PNG accepts only the `optimize` option which  
enables the best/slowest compression level (9). I think it would be  
bad for backwards compatibility to use this option to set the actual  
compression level. What about compress_level and compress_type for the  
options? I would add constants for the types in Image.py.

Any opinions or suggestions on that? I would do a fork on bitbucket  
then and start hacking.

Regards,
Oliver




More information about the Image-SIG mailing list