PIL转换图片会导致糟糕的结果

时间:2011-12-17 07:46:15

标签: python image-processing python-imaging-library

我通过数码单反相机拍照,然后点击它,并希望使用PIL调整大小。这是核心代码

image = Image.open(img_obj, 'r')
for pic_size_name, pic_size_val in pic_sizes.items():
    width, height = [int(item) for item in pic_size_val.split('x')]
    img_width, img_height = image.size
    pic_save_path = os.path.join(
                        save_path,
                        hash_val + '_' + pic_size_name + '.jpg'
                        )

    if image.mode not in ('L', 'RGB'):
        image = image.convert('RGBA')

    if width > img_width and height > img_height:
        image.save(pic_save_path, "jpeg", quality=90)
        continue

    img = image.copy()
    if pic_size_name == 's' or pic_size_name == 'xs':
        dest_ratio = float(width) / height
        current_ratio = float(img_width) / img_height
        if dest_ratio > current_ratio:
            offset = int((img_height - img_width / dest_ratio) / 2)
            box = (0, offset, img_width, img_height - offset)
        else:
            offset = int((img_width - img_height * dest_ratio) / 2)
            box = (offset, 0, img_width - offset, img_height)
        img = img.crop(box)
        img = img.resize((width, height), Image.ANTIALIAS)
        img.save(pic_save_path, "jpeg", quality=90)
    elif pic_size_name == 'm':
        new_height = img_height * width / img_width
        img = img.resize((width, new_height), Image.ANTIALIAS)
        img.save(pic_save_path, "jpeg", quality=90)
    else:
        img.thumbnail((width, height), Image.ANTIALIAS)
        img.save(pic_save_path, "jpeg")

但调整后的结果不太好。

由PIL转换:

http://cl.ly/CgR9

这是由Flickr转换的,应该是:

http://www.flickr.com/photos/lzyy/6524414285/sizes/z/in/photostream/

我使用PIL是错误的还是有一些我不知道的技巧?

1 个答案:

答案 0 :(得分:2)

然而,下载和查看GIMP中的两个图像时,不同之处在于Flickr中的图像具有嵌入的颜色配置文件,而PIL生成的图像则没有。由于我没有注意到任何对比度或锐度差异,我认为产生的色差是你所困扰的。

你必须让你的PIL工作流程ppreservign任何与图像相关的颜色配置文件 - 快速谷歌搜索带来pyCMS,其首页有4-5行示例。很可能pyCMS将是你要求的:

http://www.cazabon.com/pyCMS/