我正在将bitmapData编码为JPG。什么是良好的压缩率,在不损失整体图像质量的情况下实现更小的文件大小? (我正在寻找适用于任何图像的解决方案)
答案 0 :(得分:5)
因此,我尝试以最理论的方式回答您的问题,并解释为什么难以推荐单一的压缩率( all ) >案件。
首先,你必须至少对有损压缩和无损压缩之间的差异有一个模糊的理解。
无损压缩是一种压缩算法,它采用一组数据,将其转换为另一组较小的数据。反转过程应该产生与预压缩数据完全相同的数据集。另一方面,有损压缩不会。
使用有损压缩,允许算法丢弃它认为不需要重建原始消息的信息,但不保证重建完全相同的消息。
让我们看一个假设的例子来说明这一点。让我们说我已经提出了一种压缩英文文本的算法方法。我有一个名为A
的失败编解码器和一个名为B
的有损编解码器。假设我想压缩以下短语:
鲍勃去商店买牛奶。
通过编解码器A
运行该短语,然后将其解压缩,我会得到:
鲍勃去商店买牛奶。
但是,通过压缩率为10的编解码器B
运行相同的消息,我可能会回复以下短语:
鲍勃去商店买牛奶。
请注意,结果并不相同,但非常接近。消息的完整性保持不变,但它与我输入系统的信息不同。
现在让我们通过编解码器B
运行源消息,压缩率为5.这次,当我尝试解码压缩消息时,我可能会得到以下信息:
鲍勃去商店寻找食物。
请注意,缺少更多信息,但邮件的隐含意图仍然存在。但是我不知道,什么样的食物鲍勃去了商店。
最后,让我们通过编解码器B
以压缩率1运行源消息。这次我可能会回来:
鲍勃不在这里。
这次算法已经确定Bob已经离开的地方并不重要,只有Bob不在当前位置。原始消息的核心意图仍然保留,但其余的上下文已经丢失。
同样的理论适用于图像。 JPEG压缩通过算法丢弃数据,它不认为有必要重建图像。
JPEG实际工作的过程充满了复杂的数学,但在更高的层次上它很容易理解。它的工作原理是将图像分解成小的8x8像素块。然后它将像素集合中的像素转换为数学公式的集合(DCT-II,如果您感兴趣的话),然后通过分析这些公式,看看它可以根据给定的压缩率省略哪些公式。
在维基百科上有一篇关于DCT文章所涉及的数学的一个很好的视觉例子。
注意它是如何构建字母" A"通过将一组简单的图案块(由余弦生成)混合在一起。
现在,您会注意到 - 如果您看到的图像足够接近 - 有一堆非常接近零的系数,例如+0.006
和+0.021
。而且你会注意到,如果你仔细观察,它们对左边结果图像的影响相当小。最简单的解释是:JPEG压缩通过抛弃小值来实现,实际上不计算它们。因此,当重新构建图像时,通过反转过程(iDCT / DCT-III),它不会添加或减少块的这些细微变化。它只存储/使用对最终块影响最大的那些。
压缩率越低,它试图扔掉的越多。压缩率越高,它就越努力保持。
现在在这个阶段会有更多微妙的数学,但这是最简单的例子。
这意味着压缩器试图摆脱的信息是直接依赖在您尝试压缩的图像上。有些图像比其他图像更容易压缩而不显示视觉伪像,这仅仅是由于块的结构和它们包含的信息。
还要考虑压缩效果取决于谁正在查看它。我经常使用图像(无论是大学还是专业),并花了很多时间研究JPEG / MPEG的基础压缩机制,因此我很容易发现压缩工件,因为我知道我在寻找什么对于。但那些相同的文物可能不会被不那么敏锐的眼睛所接受。 (就像有些人不能听MP3压缩文件一样,因为他们可以在工作中听到压缩算法)
因此,您的里程可能会有所不同,具体取决于您尝试执行的操作以及您尝试压缩的图像。如果您对基础数学有一个很好的理解,那么根据您尝试压缩的图像,您可能能够根据压缩比预测什么会给你带来最好的最佳爆炸效果。 。但大多数时候,它只是实验的产物。
60%到80%之间的压缩率通常可以减小尺寸,但不会引入太多明显的视觉伪像。
答案 1 :(得分:0)
您使用的压缩在很大程度上取决于图像以及您将使用它的内容。无论何时将图像保存为JPG,您都会失去永远无法获得的质量,压缩程度越高,您丢失的质量就越高。
你需要问问自己:
如果你有一堆大的,高分辨率的图像,你想要缩小以供网络使用,你最好调整图像大小而不是降低质量。
如果我更了解你想要完成什么,以及你正在使用什么样的图像,我可以给你我个人意见。最后,它确实取决于图像和使用情况。