读取.JPG图像并保存,不更改文件大小

时间:2012-09-07 17:55:47

标签: python opencv pygame jpeg

我想写一个python代码,它读取一个.jpg图片,改变它的一些RBG组件并再次保存,而不改变图片大小。

我尝试使用OpenCV和PyGame加载图片,但是,当我尝试使用三种不同的函数进行简单的加载/保存代码时,生成的图像的大小比初始图像大。这是我使用的代码。

>>> 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。

所以,我不确定我是否遗漏了一些让图片原始尺寸发生变化的东西,虽然我只是加载/保存,不是吗?

是否有更好的库而不是OpenCV或PyGame?!

2 个答案:

答案 0 :(得分:7)

JPEG是一种有损的图像格式。当您打开并保存一个时,您将再次对整个图像进行编码。您可以调整质量设置以接近原始文件大小,但无论如何都会丢失一些图像质量。没有一般的方法可以知道原始质量设置是什么,但如果文件大小很重要,你可以猜测,直到你把它关闭。

答案 1 :(得分:3)

JPEG输出的大小取决于3件事:

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