PIL:在保持最高质量的同时缩放图像

时间:2013-07-24 18:06:37

标签: python python-imaging-library

我正在使用PIL来扩展范围从600px宽到2400px宽到大约200px宽的图像。我已合并Image.ANTIALIAS并设置quality=95以尝试获得最高质量的图像。

然而,与原件相比,按比例缩小的图像质量仍然很差。

这是我正在使用的代码:

# Open the original image
fp = urllib.urlopen(image_path)
img = cStringIO.StringIO(fp.read())
im = Image.open(img)
im = im.convert('RGB')

# Resize the image
resized_image = ImageOps.fit(im, size, Image.ANTIALIAS) 

# Save the image
resized_image_object = cStringIO.StringIO()
resized_image.save(resized_image_object, image_type, quality=95)

在保持尽可能多的图像质量的同时,沿这些比例缩放图像的最佳方法是什么?

我应该注意,我的主要目标是尽可能获得最高质量的图像。我并不真正关心这个过程的时效性。

2 个答案:

答案 0 :(得分:1)

如果使用PIL中的本机调整大小选项无法获得结果,则可以通过自己的调整大小功能运行调整大小像素值来手动计算调整大小像素值。我有三种主要的算法(我知道)用于调整图像大小:

  • 最近邻居
  • 双线性插值
  • 双立方插值

最后一个将在最长的计算时间产生最高质量的图像。要做到这一点,想象一下较小图像的像素布局,然后将其放大以匹配较大的图像,并考虑新像素位置在旧图像上的位置。然后,对于每个新像素,取16个最近像素的平均值(围绕它的4x4半径)并将其用作新值。

小图像中每个像素的结果值将是大图像的平滑但清晰的大小调整版本。

如需进一步阅读,请查看此处:Wikipedia - Bicubic interpolation

答案 1 :(得分:1)

尝试不同的方法。我不确定这是否会有所帮助,但我做了类似的事情: https://stackoverflow.com/a/13211834/1339024

可能是urlpath上的原始图像开始时质量不高。但如果你想,试试我的剧本。我用它来缩小给定目录中的图像,但这部分可能有用:

parentDir = "Some\\Path"
width = 200
height = 200
cdpi = 75
cquality = 95
a = Image.open(parentDir+'\\'+imgfile) # Change this to your url type
iw,ih = a.size
if iw > width or ih > height:
    pcw = width/float(iw)
    pch = height/float(ih)
    if pcw <= pch:
        LPC = pcw
    else:
        LPC = pch
    if 'gif' in imgfile:
        a = a.convert("RGB")#,dither=Image.NONE)
        a = a.resize((int(iw*LPC),int(ih*LPC)),Image.ANTIALIAS)
        a = a.convert("P", dither=Image.NONE, palette=Image.ADAPTIVE)
        a.save(outputDir+"\\"+imgfile,dpi=(cdpi,cdpi), quality=cquality)
    else:
        a = a.resize((int(iw*LPC),int(ih*LPC)),Image.ANTIALIAS)
        a.save(outputDir+"\\"+imgfile,dpi=(cdpi,cdpi), quality=cquality)