3

我在尝试让 PIL 很好地对图像进行下采样时遇到了麻烦。在这种情况下,目标是让我的网站在需要不同大小时自动下采样->缓存原始图像文件,从而消除维护同一图像的多个版本的痛苦。但是,我没有任何运气。我试过了:

image.thumbnail((width, height), Image.ANTIALIAS)
image.save(newSource)

image.resize((width, height), Image.ANTIALIAS).save(newSource)

ImageOps.fit(image, (width, height), Image.ANTIALIAS, (0, 0)).save(newSource)

并且所有这些似乎都执行最近邻下采样,而不是按应有的方式对像素进行平均因此它将图像变成

http://www.techcreation.sg/media/projects//software/Java%20Games/images/Tanks3D%20Full.png

http://www.techcreation.sg/media/temp/0x5780b20fe2fd0ed/Tanks3D.png

这不是很好。有没有其他人碰到过这个问题?

4

2 回答 2

5

该图像是索引颜色(调色板或 P 模式)图像。可以使用的颜色数量非​​常有限,并且调整大小的图像中的像素不太可能出现在调色板中,因为它需要很多中间颜色。所以它在调整大小时总是使用最近邻模式;这确实是保持相同调色板的唯一方法。

此行为与 Adob​​e Photoshop 中的行为相同。

如果需要,您想先转换为 RGB 模式并调整其大小,然后在保存前返回调色板模式。(实际上我只是将它保存为 RGB 模式,然后在调整大小图像的文件夹上打开 PNGCrush。)

于 2011-10-29T00:36:13.603 回答
4

这已经一年多了,但万一有人还在寻找:

这是一个代码示例,它将查看图像是否处于调色板模式,并进行调整

 import Image # or from PIL import Image
 img = Image.open(sourceFile)
 if 'P' in img.mode: # check if image is a palette type
     img = img.convert("RGB") # convert it to RGB
     img = img.resize((w,h),Image.ANTIALIAS) # resize it
     img = img.convert("P",dither=Image.NONE, palette=Image.ADAPTIVE) 
           #convert back to palette
 else:
     img = img.resize((w,h),Image.ANTIALIAS) # regular resize
 img.save(newSourceFile) # save the image to the new source
 #img.save(newSourceFile, quality = 95, dpi=(72,72), optimize = True) 
    # set quality, dpi , and shrink size

通过将调色板版本转换为 RGB,我们可以使用抗锯齿调整它的大小。如果您想将其重新转换回来,则必须将抖动设置为 NONE,并使用 ADAPTIVE 调色板。如果没有包含选项,您的结果(如果重新转换为调色板)将是颗粒状的。您还可以在保存功能中对某些图像格式使用质量选项,以进一步提高质量。

于 2012-11-03T19:31:04.847 回答