只是检查一下,让我通过实验测试ForeverWintr的分析。
用于JPEG压缩(或实际上是任何压缩)的最糟糕的输入图像是均匀随机的RGB噪声,这在理论上是不可压缩的。因此,让我使用netpbm工具生成一些信息:
$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772 rnd.png
921615 rnd.ppm
(均匀随机的RGB噪声,无损PNG格式,903 kb)
注意(2017年3月):我很确定上面的图像是我最初编写此答案并在2013年上传时的PNG格式。似乎它已在某个时刻被无声转换为JPEG,从而使此处的视觉比较变得无用。
我尝试重新上传新的PNG测试图像,但显然它在imgur达到了某种任意PNG文件大小的限制,并被自动转换为JPEG。我不确定是否可以解决此问题,但是至少如果您可以访问Linux机器,则始终可以重新运行给定的命令来生成自己的测试映像。在任何情况下,除了防止直接视觉比较压缩质量外,这都不会使下面的分析无效。
好的,因此未压缩的PPM文件的长度为640×480×3 = 921,600字节,再加上15个字节的最小PPM标头,正如预期的那样。尝试使用PNG格式进行无损压缩只会使大小增加2157字节,这大概是由PNG标头和元数据占用的,并且在尝试压缩不可压缩数据的压缩算法中可能效率不高。
(是的,这是每个像素3个字节,而不是4个字节;即使PPM格式(大约与图形文件格式一样简单)也不够笨拙,无法在磁盘上每个像素存储无用的第四个字节。可能有一些出于对齐原因而在内存中这样做的好处,尤其是在您还需要存储Alpha通道的情况下,但是在将图像写入文件时,这些原因并不适用。)
好,那么JPEG呢?让我们首先尝试最小化压缩损耗(质量= 100,无色度二次采样,浮点DCT)。不幸的是,pnmtojpeg
手册没有明确说明如何设置所有相关选项(特别是,该-sample
选项在“向导的选项”部分列出,该选项仅引用libjpeg文档中的文件),因此我将其转换为而是GIMP。生成的文件如下所示:
897249 rnd.jpg
(JPEG压缩的RGB噪声,质量= 100,无色度二次采样,876 kb)
什么,怎么会更小?我不是只是说纯净的声音是不可压缩的吗?好吧,事实是,即使以最高的质量,普通的JPEG压缩也不是无损的。在GIMP中重新打开图像并将其与原始图像进行比较,可以看到某些像素的颜色值偏移了一到两步(共256个)。这些像素是JPEG压缩算法被“欺骗”并在此处丢掉了一点,在此处又丢掉了一些,估计变化不会引起注意。的确,用肉眼无法看到的结果与原始图像几乎没有区别,但是即使考虑了标头和编码开销,那些被丢弃的位的确也增加了文件大小的可测量的减小。
这就是最高的质量;关于更典型的设置(例如pnmtojpeg
默认设置(质量= 75,启用了二次采样))呢?让我们尝试一下:
$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128 rnd2.jpg
(JPEG压缩的RGB噪声,质量= 75,色度二次采样,184 kb)
哇,从901下降到184 kb!但是,这是非常激进的压缩,并且当您仔细比较图像时,您绝对可以分辨出区别。大部分是因为色度二次采样,它基本上只丢弃了75%的颜色(色相/饱和度)数据。在禁用了二次采样的GIMP中进行尝试,可以得到一个350,618字节的文件,即使放大后,该文件看起来(至少对人来说还是非常接近)原始文件。
无论如何,这一切的关键是要证明,无论多么嘈杂的夜空照片可能是,无论你可能在如何高品质的选择,但只是没有办法一个640×480的JPEG文件,可以得到比900显著大kb。(好吧,除非您的相机在其上附加了一个多兆字节的Exif颜色配置文件或同样愚蠢的东西。)而且,如果您使用的是更典型的JPEG压缩设置,则最大可能的文件大小会降至200 kb左右。 。