Python PIL:保留行的最佳缩放方法

2024-06-28 12:16:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有黑色背景和白色线条(从Autocad导出)的2D绘图,我想使用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')

我该怎么办?


Tags: 方法图像image绘图pillibrary线条fn
2条回答

thumbnail使用的默认大小调整方法是最近的,这是一个非常糟糕的选择。例如,如果您调整到原始大小的1/5,它将输出一个像素并抛出下一个4-一个像素宽的行在结果中显示的几率只有1/5!

令人惊讶的是双线性和双三次性并没有更好。他们采用一个公式,并将其应用到离源点最近的2或3个像素上,但仍有许多像素不在他们的视线内,而且这个公式将不再强调线条的大小。

最好的选择是抗锯齿,它似乎考虑了所有的原始图像,而没有丢弃任何像素。线条会变暗,但不会完全消失;如有必要,您可以采取额外的步骤来提高对比度。

请注意,如果使用的是调色板图像,所有这些方法都将返回到最近的值,即im.mode == 'P'。必须始终转换为“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

默认情况下,im.resize使用NEAREST过滤器,它将执行您看到的操作——丢失信息,除非它恰好落在适当的模块化像素上。

而是打电话

im.resize(size, Image.BILINEAR)

这应该保留你的台词。如果没有,请尝试Image.BICUBICImage.ANTIALIAS。其中任何一个都应该比NEAREST工作得更好。

相关问题 更多 >