4
im = Image.open("grayscale.bmp")
data = im.load()
data[1,1] = 1

它报告“ValueError:图像是只读的”。只有 8 位灰度 bmp 图像会引发此异常。为什么?顺便说一句,我无法从 8 位灰度 bmp 图像中获取调色板。但是根据 BMP 规范,存在调色板。为什么?

4

2 回答 2

3

让我们从第二个问题开始。基本上,当加载带有调色板的 BMP 文件时,PIL 会检查该调色板是否包含至少一个 rgb 三元组,其中值不完全相等。如果所有三元组都相等,则假定为灰度图像并且永远不会创建调色板,因此im.palette在这种情况下始终为空。

对于第一个问题,您可能不想知道“为什么”,但我想如何解决它。否则,您获得只读图像的简化原因是由于 PIL 的内部细节:灰度 bmp 是内存映射的,而 PIL 仅支持只读模式(这似乎专门用于处理 Windows 问题)。问题的“修复”很简单,但并不完全好:将图像转换为某种模式,现在它不再是只读的。您甚至可以转换为“L”(在您的情况下这是当前模式)。

我不记得有这个问题,因为当我必须在 PIL 中处理图像时,我通常需要在某些特定模式下使用它们,所以我总是做 a img.convert(X)X我需要的模式在哪里。

于 2013-01-24T23:47:51.697 回答
0

我对ValueError: image is readonly8 位灰度 bmp 也有同样的问题。似乎仍然可以通过更改单个像素值,image.putpixel((x, y), value)尽管它比直接在像素图上操作要慢。

于 2014-11-15T11:37:20.047 回答