Li *_*oyi 3 python image downsampling python-imaging-library
我一直在尝试让 PIL 很好地对图像进行下采样时遇到问题。在这种情况下,目标是让我的网站在需要不同大小时自动下采样->缓存原始图像文件,从而消除维护同一图像的多个版本的痛苦。但是,我没有任何运气。我试过了:
image.thumbnail((width, height), Image.ANTIALIAS)
image.save(newSource)
Run Code Online (Sandbox Code Playgroud)
和
image.resize((width, height), Image.ANTIALIAS).save(newSource)
Run Code Online (Sandbox Code Playgroud)
和
ImageOps.fit(image, (width, height), Image.ANTIALIAS, (0, 0)).save(newSource)
Run Code Online (Sandbox Code Playgroud)
并且所有这些似乎都执行最近邻下采样,而不是按应有的方式对像素进行平均因此它将图像变成
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
Run Code Online (Sandbox Code Playgroud)
通过将调色板版本转换为 RGB,我们可以使用抗锯齿调整其大小。如果您想将其重新转换回来,则必须将抖动设置为“无”,并使用“自适应”调色板。如果不包含选项,您的结果(如果重新转换为调色板)将是颗粒状的。您还可以在某些图像格式的保存功能中使用质量选项来进一步提高质量。