JPEG Image Quality in PIL
Introduction
The other day, I was haunted by a bug and found that it was an issue with the image quality saved by Pillow after spending a few hours debugging the code.
Initially, the workflow of my code was like loading the JPEG image with PIL and after some operation, saving the image again. But I didn’t give any other parameters except the file name when using Image.save()
method.
The quality parameter
After looking up the documentation, I find that PIL will save the image with quality factor 75 by default so that the image quality is decreased. The documentation for quality
says:
The image quality, on a scale from 1 (worst) to 95 (best). The default is 75. Values above 95 should be avoided; 100 disables portions of the JPEG compression algorithm, and results in large files with hardly any gain in image quality.
Using a quality factor of 95 should be enough to preserve the image quality:
img.save('test.jpg', quality=95)
Subsampling
According to this post, even if you use quality=100
, the saved image will still be slightly different from the original image. This is because PIL will also use subsampling technique to reduce the image size. You can use subsampling=0
to turn off this feature. Overall, to retain the content of original image, you may use:
img.save('test.jpg', quality=100, subsampling=0)
Other options for quality
For JPEG files, there are also a list of preset options you can use for the quality
parameter, such web_high
, high
. The complete list of options can be found here. These preset options will set the subsampling
factor and quantization table which is used in image quantization process.
References
- Why is the quality of JPEG images produced by PIL so poor?
- PIL jpeg, how to preserve the pixel color