检测是否可以在不丢失信息的情况下减小位图的尺寸

Detect if a bitmap's dimensions can be reduced without losing information

我正在寻找可以使位图尽可能小而不会丢失信息的库或算法。例如,给定一个 600x400 的纯黑色图像,我想得到一个 3x2 的纯黑色图像。

我的用例:我有一个要优化的旗帜图像数据库。许多旗帜,如法国和意大利,都是由纯色块制成的,因此 png 可以比我用于西班牙等详细旗帜的高分辨率小得多。我通过导出从维基媒体中提取的经常更新的标志 SVG 数据库来生成 png 数据库。我想将所描述的无损调整大小集成到导出管道中。

我试图在网上找到这些信息,但我不太确定如何用几个关键词来描述我的问题。我一直在寻找有关无损压缩的资料,这与无损调整大小不同。

无损调整大小似乎是不可能的。因为您要将像素块(例如 2x2 或 5x3...)映射到整个图像中的单个像素,并且为了实现可逆性,块中的所有像素必须具有完全相同的颜色。

但是图像完全由这种均匀块组成的概率为零,即使是小的缩减系数。

只需保存 full-resolution PNG 图像,然后通过 optipng and AdvanceComp's advdef 等优化器保存 运行 PNG。 PNG 开箱即用,可以很好地压缩具有大面积纯色的图像。

For instance, given a 600x400 solid black image, I want to get a 3x2 solid black image. [...] Many flags, like France and Italy, are made out of blocks of solid color, so the pngs can be much smaller than the high resolution I use for detailed flags like Spain.

我做了一个实验来验证这个想法,差异不大。我生成了两个纯黑色的 PNG,一个大小为 600x400,另一个大小为 3x2,然后使用 optipng -strip all 进行了优化。结果:

black-600x400.png:  124 bytes
black-3x2.png:       68 bytes

只有几十个字节的差异。此外,值得注意的是,在这种极端情况下,大部分 PNG 文件大小是构成文件头、块结构等的强制字节,而不是图像数据本身。

我最终为相关的标志手动计算了这一点,并将该信息包含在我的标志数据库中。大多数标志 SVG 以请求的最大分辨率导出,但如果它们提供的 minimum resolution without data loss 较低,它们将以该分辨率导出。例如,我的数据库现在包含 minimum resolution without data loss 法国的 3x2 和德国的 5x3。