【问题标题】:Reading a .JPG Image and Saving it without file size change读取 .JPG 图像并保存而不更改文件大小
【发布时间】:2012-09-07 17:55:46
【问题描述】:

我想编写一个读取 .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 更好的库吗?!

【问题讨论】:

  • 您可能想尝试另存为LenPEG ;)
  • @mgilson 您可以进行的编辑类别将大大缩小。
  • @JoshLee -- 这是一个公平的观点(但图像大小将保持不变)...
  • 如果您正在修改每像素,您可能更喜欢使用 .png 格式,它是无损的,而 jpg 是有损的。好奇为什么要求文件大小保持不变?
  • 我要保证每个像素的数量和值在压缩/解压阶段保持不变。

标签: python opencv pygame jpeg


【解决方案1】:

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

【讨论】:

  • 而且在图像质量和压缩率之间有一个权衡。对信息丢失的容忍度越低,图像越大。
  • 但这意味着解码的质量与编码的质量不同。否则 .jpg 的解码/编码应该是可逆的,因为损失已经在 .jpg 图片的初始创建中? -- 根据我对 JPEG 编码/解码算法的了解。
  • 这意味着当我在 Windows 中旋转 jpg 时可能会丢失细节? (这对我来说很重要,因为我将它们用于摄影测量)
【解决方案2】:

JPEG 输出的大小取决于 3 个因素:

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

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

【讨论】:

    最近更新 更多