我一直在努力让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
这不是很好。还有其他人遇到过这个问题吗?
答案 0 :(得分:4)
该图像是索引颜色(调色板或P模式)图像。使用的颜色数量非常有限,并且调整大小的图像中的像素很可能不会出现在调色板中,因为它需要大量的中间颜色。所以它在调整大小时总是使用最近邻模式;它确实是保持相同调色板的唯一方法。
此行为与Adobe Photoshop中的行为相同。
如果需要,您希望先转换为RGB模式并调整其大小,然后在保存之前返回调色板模式。 (实际上我只是将它保存在RGB模式下,然后在调整大小的图像的文件夹上打开PNGCrush。)
答案 1 :(得分:2)
这已超过一年了,但万一有人仍在寻找:
下面是一个代码示例,它将查看图像是否处于调色板模式,并进行调整
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调色板。如果没有包含选项,您的结果(如果重新转换为调色板)将是颗粒状的。您还可以在保存功能中使用某些图像格式的质量选项来进一步提高质量。