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

问题描述

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

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

我尝试在线查找此信息,但是我不确定如何用几个关键字来描述我的问题。我一直在寻找有关无损压缩的内容,这与无损调整大小不同。

解决方法

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

但是,即使对于较小的缩小因子,仅由此类均匀块构成图像的可能性也为零。

,

只需保存全分辨率PNG图像,然后通过optipngAdvanceComp's advdef之类的优化器运行PNG。 PNG开箱即用,可以很好地压缩具有大范围纯色的图像。

例如,给定600x400的纯黑色图像,我想获得3x2的纯黑色图像。 [...] 许多国旗(例如法国和意大利)都是由纯色块制成的,因此png的尺寸可能比我用于西班牙等详细国旗的高分辨率要小得多。

我做了一个实验来验证这个想法,但两者之间的差异令人难以置信。我生成了两个纯黑色的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。