读取 .JPG 图像并保存它而不改变文件大小

4
我希望编写一个Python代码,读取一张.jpg图片,修改其某些RGB组件并再次保存,而不改变图片尺寸。
我尝试使用OpenCV和PyGame加载图片,但在使用三个不同函数的简单Load/Save代码时,生成的图像比初始图像大。这是我使用的代码。
>>> import cv, pygame # Importing OpenCV & PyGame libraries.
>>> image_opencv = cv.LoadImage('lena.jpg')
>>> image_opencv_matrix = cv.LoadImageM('lena.jpg')
>>> image_pygame = pygame.image.load('lena.jpg')
>>> cv.SaveImage('lena_opencv.jpg', image_opencv)
>>> cv.SaveImage('lena_opencv_matrix.jpg', image_opencv_matrix)
>>> pygame.image.save(image_pygame, 'lena_pygame.jpg')

原始大小为48.3K,转换后的大小分别为75.5K、75.5K、49.9K。

所以,我不确定是否有什么东西会导致图片的原始大小发生变化,尽管我只进行了一次Load/Save操作?

除了OpenCV或PyGame之外,是否有更好的库可以使用?!


你可能想尝试保存为LenPEG ;) - mgilson
@mgilson 你可以进行的编辑类别将大大缩小。 - Josh Lee
@JoshLee -- 这是一个很好的观点(但图像大小将保持不变)... - mgilson
如果您正在修改每个像素,您可能更喜欢使用.png格式,这是无损的,而不是有损的jpg格式。好奇为什么您需要文件大小保持静态? - ninMonkey
我想要确保在压缩/解压缩阶段中,每个像素的数量和值保持不变。 - Mahmoud Aladdin
2个回答

7

JPEG是一种有损图像格式。当你打开并保存它时,你会重新编码整个图像。你可以调整质量设置来近似原始文件大小,但无论如何都会失去一些图像质量。通常没有办法知道原始质量设置是什么,但如果文件大小很重要,你可以猜测直到接近为止。


图像质量和压缩比之间存在一种权衡。对信息丢失的容忍度越低,生成的图像就越大。 - wberry
但这意味着解码的质量与编码的质量不同。否则,.jpg 的解码/编码应该是可逆的,因为损失已经在 .jpg 图片的初始创建中了?-- 这是根据我对 JPEG 编码/解码算法的了解。 - Mahmoud Aladdin
当我在Windows中旋转jpg时,它有可能会丢失细节吗?(这对我很重要,因为我将它们用于摄影测量) - Heetola

3
JPEG输出的大小取决于三个因素:
  1. 原始图像的尺寸。在您的情况下,这对所有3个示例都是相同的。
  2. 图像内的颜色复杂度。具有大量细节的图像比空白图像要大。
  3. 编码器中使用的质量设置。在您的情况下,您使用了默认设置,OpenCV与PyGame相比似乎更高。更好的质量设置会生成一个更接近原始的(损失较少)但更大的文件。
由于JPEG的有损性质,其中一些略微不可预测。您可以保存具有特定质量设置的图像,打开该新图像并在完全相同的质量设置下再次保存它,由于第一次保存时引入的更改,它可能会稍微不同大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接