如何使用Python PIL库保存16位PGM格式图像?
如何用Python PIL库保存16位PGM图像?
问题分析
你之前的尝试存在几个关键问题:
- 直接保存或指定
bits=16无效:原图是8位灰度模式(L),PIL不会自动将8位的0-255数值范围扩展到16位的0-65535,只是用16位容器存储8位数据,因此GIMP仍识别为8位图像。 - numpy数组处理错误:
image.getdata()返回一维像素序列,转成数组后是一维结构,用Image.fromarray生成的图像尺寸异常;同时未正确指定图像模式,导致保存时触发格式识别错误。
正确实现代码
from PIL import Image import numpy as np # 读取PNG并转为8位灰度模式(若原图是RGB,先转灰度) img = Image.open("test.png").convert("L") # 将8位数据转换为16位,并缩放数值范围至0-65535 # 257 = 65535 / 255,刚好将0-255映射到0-65535 img_16bit_array = np.array(img, dtype=np.uint16) * 257 # 从16位数组创建图像,指定模式为"I;16"(16位无符号灰度) img_16bit = Image.fromarray(img_16bit_array, mode="I;16") # 保存为16位PGM img_16bit.save("test_16bit.pgm")
关键说明
- 模式指定:
I;16是PIL中16位无符号灰度图像的标准模式,确保保存时生成16位PGM格式。 - 数值范围缩放:必须将8位的0-255映射到16位的0-65535,否则即使是16位格式,实际有效数据仍为8位,工具会识别为8位图像。
- 数组形状:直接用
np.array(img)保留原图像的二维结构(高×宽),避免生成尺寸异常的图像。
内容的提问来源于stack exchange,提问作者Runsva
相关产品推荐
相关产品推荐

