Here's something that was bugging me for a while. It was one of those things that was justannoying enough to make me cringe whenever I saw the result but never important enough to fix.
At any rate, for some time I have been working on a project at my day-job where some simple server-side image manipulation was required. It's a Django project, so I've been using Python's PIL. All I was doing was some resizing and cropping.
When I first started using PIL, I noticed that I was getting some significant grainyness when saving an image. After a little poking around, I found that during image resizing, one can use an anti-aliasing filter.
import Image img = Image.open("path/to/image.jpg") img = img.resize((100,100), Image.ANTIALIAS) img.save("path/to/new_image.jpg")
This somewhat cleared up the image quality issues I was having. It still wasn't great, mind you, but it was generally "good enough" and at the time, I needed to move on.
Months went by of looking at those resized images and being just ever-so-slightly annoyed; not enough to do anyhting about it but just enough to subconsciously cringe a little each time I saw one. Recently, I was revisiting that part of the project and decided it would be a good time to try to figure out how to maintain better image quality when using the PIL.
What I found (and what doesn't seem to be documented in the PIL's Image docs) is that one can pass a "quality" argument to the save method.
import Image img = Image.open("path/to/image.jpg") img = img.resize((100,100), Image.ANTIALIAS) img.save("path/to/new_image.jpg", quality=100)
This is akin to dealing with the quality setting when saving a JPEG in photoshop. I learned this out after finding Djangosaur, which, by the way, is a damn cool name for a django blog.
It's somewhat tough to see the difference between antialias only and antialiased saved at 100 quality in the above examples. It's probably clearer in the picture of me than in the picture of the dog. However, it is a bit grainier, especially in larger images.