You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用PIL正确修改图像单个像素值并确保保存后值不变?

如何使用PIL正确修改图像单个像素值并确保保存后值不变?

嗨,作为Python爱好者遇到这个问题很正常,我来帮你理清楚原因和解决办法~

你遇到的问题核心在于图像格式的压缩特性图像颜色模式这两个点,咱们一步步来解决:

为什么修改后的像素值保存后变了?

  1. JPEG是有损压缩格式:你保存用的tree-ALT.jpg是JPEG格式,这种格式为了缩小文件大小,会对图像数据进行有损压缩,哪怕你只改了一个像素,保存时也会被压缩算法调整,导致像素值和你设置的不一样。
  2. 图像可能是索引颜色模式:如果你的原图是P模式(索引颜色),这种模式的图像是用调色板存储颜色的,你调用putpixel时,PIL会自动把你设置的RGB值映射到调色板里最接近的颜色,自然就和你设置的不一样了。

解决办法

步骤1:确保图像是RGB模式

打开图像时先转换成RGB模式,避免索引模式的影响:

from PIL import Image
# 打开图像并强制转换为RGB模式
img = Image.open('tree.jpg').convert('RGB')

步骤2:用无损格式保存

想要精确保留像素值,一定要用无损压缩的图像格式,比如PNG:

# 修改[5,5]像素为(0,0,118)
img.putpixel((5,5), (0,0,118))
# 保存为PNG格式
img.save('tree-ALT.png')

步骤3:验证修改结果

现在再读取保存后的图像,就能看到正确的像素值了:

# 读取修改后的图像
img_verify = Image.open('tree-ALT.png')
# 获取[5,5]像素值
print(img_verify.getpixel((5,5)))  # 输出应该是(0,0,118)

额外小提示

如果你因为某些原因必须保存为JPEG,可以尝试设置最高质量参数,虽然不能完全避免损失,但能尽量接近你设置的值:

img.save('tree-ALT.jpg', quality=100)

不过还是更推荐用PNG来保证像素值的绝对准确哦~

备注:内容来源于stack exchange,提问作者Markas M

火山引擎 最新活动