Python图像库:干净的下采样

5 投票
2 回答
9717 浏览
提问于 2025-04-17 05:13

我最近在用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

看起来并不好。有没有人遇到过这个问题?

2 个回答

5

这段内容虽然有点旧,但如果还有人关心的话,下面是一些信息:

这里有一段代码示例,可以用来检查一张图片是否处于调色板模式,并进行相应的调整。

 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格式,我们可以用抗锯齿的方式来调整图片大小。如果你想再把它转换回调色板模式,就需要把抖动设置为“无”,并使用自适应调色板。如果不包含这些选项,重新转换回调色板时,图片会显得颗粒感很强。此外,在某些图片格式的保存功能中,你还可以使用质量选项来进一步提升图片的质量。

5

那张图片是用索引颜色(调色板或P模式)制作的。这种模式下可用的颜色非常有限,所以在调整图片大小时,像素的颜色很可能不会在调色板里,因为需要很多中间颜色来填补。为了保持调色板不变,调整大小时总是使用最近邻模式;这其实是唯一能做到的方式。

这种情况和Adobe Photoshop里的表现是一样的。

如果你想调整大小,建议先转换成RGB模式,然后再调整大小,最后如果需要的话再换回调色板模式保存。(其实我会直接保存为RGB模式,然后用PNGCrush处理调整大小后的图片文件夹。)

撰写回答