Python Image Library: clean Downsampling



我一直在试图让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

不太好。还有人碰到这个问题吗?

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

此行为与Adobe Photoshop中相同。

你想要转换到RGB模式,并调整它的大小,然后回到调色板模式之前保存,如果需要的话。(实际上我会把它保存在RGB模式,然后把PNGCrush放在调整大小的图像文件夹上)

这是一年多前的事了,但如果有人还在看:

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

 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,并使用自适应调色板。如果没有包含选项,则结果(如果重新转换为调色板)将是颗粒状的。你也可以使用质量选项,在保存功能,对一些图像格式,以提高质量甚至更多。

最新更新