我是 Python 新手,并尝试使用 PIL 执行我需要的 Arduino 项目的解析任务。这个问题与Image.convert()
调色板、抖动等的方法和选项有关。
我有一些硬件能够一次仅显示 16 种颜色的图像(但它们可以指定为 RGB 三元组)。因此,我想自动执行获取任意真彩色 PNG 图像的任务,选择“最佳”16 色调色板来表示它,并将图像转换为仅包含 16 种颜色的调色板。
我想使用抖动。问题是,这种image.convert()
方法似乎有点古怪。它的论点没有完全记录(Image.convert() 的 PIL 文档),所以我不知道这是我的错还是该方法有问题。
我的代码的简单版本如下:
import Image
MyImageTrueColor = Image.new('RGB',100,100) # or whatever dimension...
# I paste some images from several other PNG files in using MyImageTrueColor.paste()
MyImageDithered = MyImageTrueColor.convert(mode='P',
colors=16,
dither=1
)
根据我所做的一些搜索(例如:如何使用 PIL 减少调色板),我认为这种方法应该可以满足我的要求,但没有运气。它使图像抖动,但会产生超过 16 种颜色的图像。
只是为了确保,我删除了“抖动”参数。相同的输出。
我重新添加了“dither=1”参数并加入了 Image.ADAPTIVE 参数(如上面的链接所示),只是为了看看发生了什么。这导致图像包含 16 种颜色,但没有抖动。
我在这里错过了什么吗?PIL 有问题吗?我想出的解决方案是执行 2 个步骤,但这似乎草率且不必要。我想弄清楚如何正确地做到这一点:-) 为了完整起见,这是我的代码版本,它产生了正确的结果——但它以一种草率的方式做到了。(第一步会产生 >16 色的抖动图像,而第二步会产生仅包含 16 色的图像。)
MyImage_intermediate = MyImageTrueColor.convert(mode='P',
colors=16
)
MyImageDithered = MyImage_intermediate.convert(mode='P',
colors=16,
dither=1,
palette=Image.ADAPTIVE
)
谢谢!