我有一张带有黑色背景和白线的2D绘图(从Autocad导出),我想使用Python PIL library创建一个保留行的缩略图。
但是我使用“缩略图”方法得到的只是一张散布着白点的黑色图片。
请注意,如果我将图像放入具有固定宽度的IMG标记中,我将获得我想要的内容(但图像已完全加载)。
发表评论后,这是我的示例代码:
from PIL import Image
fn = 'filename.gif'
im = Image(fn)
im.convert('RGB')
im.thumbnail((300, 300), Image.ANTIALIAS)
im.save('newfilename.png', 'PNG')
我该怎么办?
答案 0 :(得分:13)
thumbnail
使用的默认调整大小方法是NEAREST,这是一个非常糟糕的选择。例如,如果您调整大小为原始大小的1/5,它将输出一个像素并抛出下一个4 - 一个像素宽的线只有五分之一的机会显示 在结果中!
令人惊讶的是,BILINEAR和BICUBIC并没有好多少。他们采用一个公式并将其应用于距离源点最近的2或3个像素,但是仍然有许多像素看不到它们,并且公式将无论如何都会强调该线。
最好的选择是ANTIALIAS,它似乎考虑了所有原始图像而不丢弃任何像素。线条会变暗,但不会完全消失;如果需要,你可以做一些额外的步骤来提高对比度。
请注意,如果您正在使用调色板图像(即im.mode == 'P'
),则所有这些方法都将回退到NEAREST。您必须始终转换为'RGB'。
from PIL import Image
im = Image.open(fn)
im = im.convert('RGB')
im.thumbnail(size, Image.ANTIALIAS)
以下是来自electronics.stackexchange网站https://electronics.stackexchange.com/questions/5412/easiest-and-best-poe-ethernet-chip-micro-design-for-diy-interface-with-custom-ard/5418#5418
的示例使用默认的NEAREST算法,我假设该算法与您的结果类似:
使用ANTIALIAS算法:
答案 1 :(得分:3)
默认情况下,im.resize
使用NEAREST
过滤器,它将执行您所看到的内容 - 丢失信息,除非它恰好落在适当模数的像素上。
而是打电话
im.resize(size, Image.BILINEAR)
这应该保留你的线条。如果没有,请尝试Image.BICUBIC
或Image.ANTIALIAS
。其中任何一个都应该比NEAREST
更好。