如何知道 golang 中图像的当前“质量”?我需要减小文件大小

问题描述 投票:0回答:1

我正在尝试减少/压缩 golang 中图像的文件大小。当我使用 jpeg.Encode 并将选项作为参数传递给 Quality 75 时,10mb 的图像变成了 18mb 的图像....我不明白为什么,这是这个库中质量的概念?

我还想知道在编码之前我怎么知道哪个是原始质量,我想如果我知道我可以用更小的值设置它或者尝试另一种方式,比如将图像的高度和宽度调整 10%。

我希望了解 jpeg.Encode 函数中选项参数的质量属性的标准。我想获得更多关于图像文件大小以及如何减少它的知识。

go encode filesize image-compression
1个回答
0
投票

JPEG 质量参数不是图像的特征,而是JPEG 编码过程的特征。由于 JPEG 是一种有损编码,这意味着编码后的图像无法解码为准确的原始图像,因此您可以向编码器指定它应该如何忠实地尝试复制原始图像。质量 100 应该几乎没有损失,较低的质量将使编码器不那么努力。因此,质量参数越大,文件越大,因为编码器试图保留更多信息。]

为了直观地理解为什么编码文件最终会比原始文件大,这里有一个人类语音“压缩”的例子(不是 JPEG,但从信息论的角度来看,同样的原则适用):

00000000000000000000000000000000000000000000000000
可以描述为“五十个零”,压缩比为 50:12(即源长度减少了四倍多)。

01101
是“一个零,两个一,一个零一个一”,5:34比例压缩失败,编码值几乎是原来的七倍

这张照片(来自 JPEG 上的维基百科页面)显示了质量参数对结果图像的影响,从左边的 0 到右边的 100:

effect of the quality parameter

如果不尝试对图像进行编码,编码器就无法知道结果是什么;这在很大程度上取决于形象。 JPEG 非常擅长编码颜色渐变,但在锐利边缘方面非常糟糕。因此,它可以很好地压缩照片,但在某些方面会非常糟糕。静态噪音。

这意味着没有“编码前的原始质量”,除非您的图像已经进行了 JPEG 编码。如果图像已经进行了 JPEG 编码,并且您尝试对其进行重新编码,您通常会发现尺寸增加几乎没有收益(因为编码器不仅试图复制图像,而且还试图复制之前的人工制品)编码),就像您尝试压缩已压缩的文件一样。对已经以其他方式编码的图像进行转码可能会或可能不会导致文件大小减小,具体取决于图像和之前使用的编码。

© www.soinside.com 2019 - 2024. All rights reserved.