4

我想编写一个读取 .jpg 图片的 python 代码,更改它的一些 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 更好的库可以使用?!

4

2 回答 2

7

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

于 2012-09-07T18:01:54.557 回答
3

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

  1. 原始图像的尺寸。在您的情况下,这对于所有 3 个示例都是相同的。
  2. 图像中的颜色复杂度。具有很多细节的图像将大于完全空白的图像。
  3. 编码器中使用的质量设置。在您的情况下,您使用了默认值,OpenCV 与 PyGame 的默认值似乎更高。更好的质量设置将生成更接近原始文件(损耗较小)但更大的文件。

由于 JPEG 的有损性质,其中一些是稍微不可预测的。您可以使用特定质量设置保存图像,打开该新图像并以完全相同的质量设置再次保存,由于第一次保存时引入的更改,它的大小可能会略有不同。

于 2012-09-07T18:19:20.057 回答