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



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

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

我试着在网上找到这些信息,但我真的不知道如何用几个关键词来描述我的问题。我一直在寻找关于无损压缩的东西,这与无损调整大小不同。

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

但是,即使对于较小的缩小因子,图像完全由这种均匀块制成的概率也是零。

只需保存全分辨率PNG图像,然后通过optipng和AdvanceComp的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更低,则会以该分辨率导出。例如,我的数据库现在包含法国3x2和德国5x3的minimum resolution without data loss

最新更新