可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have python code that needs to do just a couple simple things to photographs: crop, resize, and overlay a watermark. I've used PIL, and the resample/resize results are TERRIBLE. I've used imagemagick, and the interface and commands were designed by packaging a cat in a box, and then repeatedly throwing it down a set of stairs at a keyboard.
I'm looking for something which is not PIL or Imagemagick that I can use with python to do simple, high-quality image transformations. For that matter, it doesn't even have to have python bindings if the command line interface is good.
Oh, and it needs to be relatively platform agnostic, our production servers are linux, but some of our devs develop on windows. It can't require the installation of a bunch of silly gui code to use as a library, either.
回答1:
I've used PIL, and the resample/resize results are TERRIBLE.
They shouldn't be, as long as you:
- use only Image.ANTIALIAS filtering for downscaling operations
- use only Image.BICUBIC filtering for upscaling operations.
- remember to convert to 'RGB' colour mode before the resize if you are using a paletted image
- don't use .thumbnail(). it's crap
- set the
quality=
level to something appropriate when saving JPEGs (the default is quite low)
回答2:
I'm unsure as to why Image.thumbnail is getting such flak. In the present release that I'm running off of it does little more than figure out the desired size and resize the image in place. As long as you're using the proper resample filter and convert to RGB first (as bobince says) thumbnail shouldn't be any different than resize.
Here's the actual source for the thumbnail method:
def thumbnail(self, size, resample=NEAREST):
# preserve aspect ratio
x, y = self.size
if x > size[0]: y = max(y * size[0] / x, 1); x = size[0]
if y > size[1]: x = max(x * size[1] / y, 1); y = size[1]
size = x, y
if size == self.size:
return
self.draft(None, size)
self.load()
try:
im = self.resize(size, resample)
except ValueError:
if resample != ANTIALIAS:
raise
im = self.resize(size, NEAREST) # fallback
self.im = im.im
self.mode = im.mode
self.size = size
self.readonly = 0
回答3:
PIL can do good resizing. Make sure your source image is in RGB mode, not palette colors, and try the different algorithm choices.
回答4:
While imagemagick seems to be the de facto open-source imaging library, possibly DevIL (cross platform, seems to do simple image operations) or FreeImage.
回答5:
Have you checked pypi? A cursory search shows some image related tools there, I also discovered python-gd, no clue how useful it might be though.
I've never had any issues with PIL myself, but some kind of variety might be interesting.
回答6:
GIMP has a reasonable command-line interface, I think.
回答7:
Take a look at some of these imaging libraries:
hxxp://pypi.python.org/pypi/collective.croppingimagefield/0.1beta
hxxp://pypi.python.org/pypi/cropresize/0.1.1
hxxp://pypi.python.org/pypi/image_resize/1.0
回答8:
Last time I compared, this downscaler's output is almost identical to that of GIMP's "cubic" option:
import Image
def stretch(im, size, filter=Image.NEAREST):
im.load()
im = im._new(im.im.stretch(size, filter))
return im
IIRC, the differences are visually indistinguishable -- some pixel values +/-1 due to rounding, and they tend to be round the edges. It's not slow either.
cf: http://www.mail-archive.com/image-sig@python.org/msg00248.html
回答9:
I've used PIL, and the resample/resize results are TERRIBLE.
Resizing in PIL was broken in many ways and PIL is not maintained for a long time. Starting from Pillow 2.7 most of the problems are fixed along with dramatically performance improvement. Make sure you are using latest Pillow.