[Image-SIG] PIL PNG encoding performance
olt at bogosoft.com
Thu Mar 4 14:31:02 CET 2010
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
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.
More information about the Image-SIG