[MapProxy] Improving the performance for PNG requests
olt at omniscale.de
Mon Aug 2 07:32:58 EDT 2010
the release notes of 0.8.4 already mentioned that we improved the
performance for PNG files.
There is a new blog post that has some more details on that: http://blog.mapproxy.org/improving-the-performance-for-png-requests
There is a copy of this post below.
MapProxy uses the [Python Image Library](http://www.pythonware.com/products/pil/
) (PIL) for everything image related: decoding, resizing, cropping,
merging, transforming and encoding. Core parts of PIL are written in C
and so is MapProxy able to keep up with pure C servers, and even trump
them. Only the PNG encoding is significantly slower than other
There are two major variations of PNG files, often called PNG-24 and
PNG-8. PNG-24 stores full color information for each pixel, while
PNG-8 only supports a total of 256 different colors per image. The
benefit of PNG-8 is that the files size reduces to 1/3. This process
of reducing the possible 16.7 million colors of PNG-24 to a palette of
only 256 colors is called color quantization.
We profiled the PNG encoder and found the bottleneck of the encoding
process was in that color quantization. We've implemented a new
algorithm, based on the octree algorithm, that offers better
performance. Much better performance. The whole encoding process
itself got about 10 times faster, increasing the MapProxy performance
for PNG requests about 2-3 times, wich is now on a par with the JPEG
It even gets better: The new quantizer has also full transparency
support. Prior to this, MapProxy could return images with transparency
only in PNG-24 mode, but now transparency is also supported for PNG-8.
For these images, the file size reduces to 1/4 of the PNG-24 size,
while having the same performance boost.
### How to use the new quantizer ###
The development of our modification is available at http://bitbucket.org/olt/pil-117-fastpng
The modification is not yet included in the official PIL version, but
the maintainer told me that it should be merged later this summer and
that it should be available in the next PIL release.
But you can already use it anyway. There is a source package available
and you can install and compile it with:
$ pip install http://bitbucket.org/olt/pil-117-fastpng/downloads/PIL-1.1.7-fastpng-a6.tar.gz
You need the latest MapProxy 0.8.4 release or the upcoming 0.9.0 to
get support for the new quantizer.
By default, MapProxy will still generate PNG-24 for transparent
images. To enable PNG-8 for these images, you have to add the
following to your proxy.yaml:
Thats it. You should now have a MapProxy that is 2-3 times faster for
PNG files, and with the reduced file size even faster for you users.
Oliver Tonnhofer <olt at omniscale.de>
Omniscale - Dominik Helle, Oliver Tonnhofer GbR
Nadorster Str. 60, 26123 Oldenburg
Tel: +49(0)441/9392774-2 (Fax: 9)
More information about the MapProxy