2

我正在使用 PIL 来缩放从 600 像素宽到 2400 像素宽到大约 200 像素宽的图像。我已经合并Image.ANTIALIASquality=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)

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

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

4

2 回答 2

2

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

  • 最近的邻居
  • 双线性插值
  • 双三次插值

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

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

如需进一步阅读,请查看此处:维基百科 - 双三次插值

于 2013-07-24T18:51:33.933 回答
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)
于 2013-07-24T19:03:41.073 回答