python - 为什么PIL不能修改灰度BMP图像数据?

标签 python python-imaging-library bmp

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

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

最佳答案

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

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

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

关于python - 为什么PIL不能修改灰度BMP图像数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12863015/

相关文章:

python - Docker 错误 - 命令错误 : "0.0.0.0:" is not a valid port number or address:port pair

python - 在python中将url添加到mysql行

python 3。八叉树实现占用大量内存。如何优化?

python - PIL jpeg,如何保留像素颜色

c - Valgrind 在检查内存泄漏时可能丢失消息 - C

c - 划分位图以进行并行处理

python - 使用 OpenCV cv2.VideoCapture 在 Python 中从 IP 摄像机流式传输视频

python - cv2.imencode() 的作用是什么?我如何使用 PIL 实现相同的目的?

python - 使用 TKinter 在对象内部定义的图像按钮

C#:如何将 BITMAP 字节数组转换为 JPEG 格式?