使用OpenCV读写JPEG后内容不一致,如何保留原内容?数据在哪步被修改?
能否通过OpenCV保留原始JPG图像内容?数据修改发生在哪一步?
结论
不能直接通过OpenCV的imread()+imwrite()流程保留原始JPG文件的完整内容,MD5不匹配的问题出在图像解码与重新编码的两个核心阶段。
数据修改的具体环节
读取阶段:解码丢失原始文件专属信息
cv2.imread()读取JPG时,会把压缩的JPG字节流解码为像素矩阵(OpenCV默认输出BGR格式的numpy数组)。这个过程只提取了图像的像素数据,会丢弃原始JPG里的元数据、自定义压缩参数(比如量化表、霍夫曼表)、文件头细节等关键信息——这些都是构成原始文件字节流的必要部分,解码后无法复原。写入阶段:重新编码生成全新字节流
cv2.imwrite()会对解码得到的像素矩阵重新做JPG编码,不管设置IMWRITE_JPEG_QUALITY为100还是默认的95,都会使用OpenCV内置的编码参数(比如默认量化表、编码逻辑),和原始文件的编码参数几乎不可能完全一致。哪怕视觉上像素没有损失,生成的文件字节流也和原文件完全不同,MD5校验自然不匹配。
完全保留原始文件内容的方法
如果只是要完整复制原始JPG文件,不需要经过图像编解码,直接复制文件字节流即可:
with open('./baboon.jpg', 'rb') as src_file, open('./baboon_copy.jpg', 'wb') as dst_file: dst_file.write(src_file.read())
这样复制出的文件MD5值会和原文件完全一致。
内容的提问来源于stack exchange,提问作者kym
相关产品推荐
相关产品推荐

