You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中修改图像每个像素的值(不使用第三方库)

问题:直接修改JPG二进制数据后无法生成可解码图像

你遇到的问题核心在于JPG是压缩图像格式,它的二进制内容根本不是直接对应像素的RGB值!

为什么你的代码不行?

你之前误以为读取到的每个0-255字节都是像素数据,但实际上JPG文件里的字节大部分是压缩编码信息、文件头、元数据,只有极少部分和原始像素相关(还是经过压缩变换的)。直接修改这些字节会彻底破坏JPG的压缩结构,系统自然无法解码。而直接复制二进制内容能成功,是因为你完整保留了整个合法的JPG文件结构。

不用第三方库的解决方案:操作无压缩位图(BMP)

如果不想用PIL这类库,你需要先处理无压缩的位图文件(比如BMP),因为它的像素数据是直接存储的,没有经过压缩。步骤如下:

  1. 先把你的hey.jpg转成BMP格式:用Windows自带的画图工具打开JPG,点击「另存为」选择BMP格式保存为hey.bmp。
  2. 用Python操作BMP的像素数据(注意BMP的像素是按BGR顺序存储的,不是你以为的RGB):
# 以字节数组形式读取BMP文件,方便修改
with open("hey.bmp", "rb") as input_file:
    bmp_content = bytearray(input_file.read())

# BMP标准文件头长度为54字节,之后的内容就是原始像素数据
header_length = 54
pixel_section = bmp_content[header_length:]

# 按照你的逻辑修改像素值:非255的字节加1,255保持不变
for index in range(len(pixel_section)):
    if pixel_section[index] != 255:
        pixel_section[index] += 1

# 将修改后的像素数据写回原字节数组
bmp_content[header_length:] = pixel_section

# 保存修改后的BMP文件
with open("new.bmp", "wb") as output_file:
    output_file.write(bmp_content)
  1. 生成的new.bmp可以直接打开查看效果,如果需要转回JPG,再用画图工具打开BMP另存为JPG即可。

补充说明

  • BMP的像素存储顺序是B→G→R,所以你修改的第一个像素字节是蓝色通道,第二个是绿色,第三个是红色,这点和你之前观察的RGB顺序相反,需要注意。
  • 如果你坚持要直接处理JPG,那必须手动实现JPG的解码和编码逻辑——这几乎是不可能完成的任务,因为JPG的压缩算法非常复杂,涉及DCT变换、熵编码等,远不是简单修改字节能做到的。

内容的提问来源于stack exchange,提问作者soldier captain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:27:36