如何使图像文件尽可能密集?

时间:2013-11-08 14:40:22

标签: image png filesize rgba

假设我有一个图像文件,我知道最终会是1024 x 1024,我想让该文件尽可能大(磁盘空间)。假设一个72-dpi分辨率的PNG文件,我将填充此文件以使其尽可能密集信息?某些颜色比其他颜色更贵吗?模式?阿尔法水平?我正在考虑专门的PNG文件,但也有兴趣了解GIF和JPG文件。

2 个答案:

答案 0 :(得分:2)

你想让图像难以压缩,这在信息理论中意味着"最大熵",在我们的例子中意味着:"白噪声"。 实际上,这意味着:为0-255范围内的每个像素值(每个R-G-B分量)赋予每个像素一个(均匀且独立的)随机值。如果您可以添加ALPHA频道,请执行相同操作。 (当然,如果你要存储一个PNG文件,你可以使用16位深度...但我猜这会是作弊的。)

该文件大约为1024x1024x3字节= 3MB(如果是RGB,x4,如果使用RGBA),PNG将无法压缩它。

GIF或JPEG也是如此(但使用GIF时,您只能使用索引图像,因此大小约为1MB)。

答案 1 :(得分:2)

通常,PNG采用“无损”压缩,通常通过在文件中查找重复的RGB值和/或重复的切片或扫描线来实现。你可以在这里阅读更多内容:

http://www.libpng.org/pub/png/book/chapter09.html

在一般情况下,击败几乎任何无损压缩,所有你需要做的是,以填补随机RGB噪声的图像,以这样的方式使像素的RGB值来每个扫描线与每个相邻像素outwildly不同。知道你将与总共有1048576个像素的文件,这是刚刚超过一百万来工作,和24位PNG为您提供了16777216种颜色可供选择(24位色,每通道8位),你可以试着品尝每当采样时,每16个颜色调整它的值,然后将其写入图像。

有关该主题的更多有趣信息,请参阅 Concept check: any lossless data compression can be "defeated', right?

举一个简单的例子,让我们生成您尺寸的PNG并用随机噪声填充它:

require 'rubygems'
require 'chunky_png'

dimension = 1024
png = ChunkyPNG::Image.new(dimension, dimension)

total_colors = 2 ** (8*(3+1)) # 3 + 1 because we have alpha too!

(0...dimension).each do | x |
  (0...dimension).each do | y |
    r = Random.new.rand(0..total_colors) 
    png[x, y] = r
  end
end

png.save('/tmp/noise.png')
`open /tmp/noise.png`

这给我一个OSX上的4.2兆字节文件。当我在其上运行pngcrush进行一些压缩时,我得到一个相同大小的文件。如果您想使现有图像不可压缩,您可以尝试以相同的方式混合噪声。