【发布时间】:2012-02-12 19:55:33
【问题描述】:
我有大约 1000 个相同大小(32 像素 x 32 像素)的 PNG 图像(图块)。它们看起来都不同,但有些非常相似(它们使用相同的颜色)。我必须将它们总结为 PNG 图像(块),每个图像大约有 50 个图块。块大小是动态的,但不能太小。
我的目标是最小化生成的块的大小。
Wikipedia 告诉我 PNG 文件的大小取决于每个像素的颜色深度。
我的想法是将图块分组,使每个组的颜色最少。还需要存储颜色索引,因此将每个图块保存为块不是最佳解决方案。蛮力运行需要很长时间,所以我希望有一个分组算法的草图。
我假设当颜色数量超过 1、2、4、8、16、32 等时,文件大小会“跳跃”。所以这些可能是需要注意的阈值。
我现在将绘制一个不会产生最优解的算法
定义
引入组平铺距离。一组图块 A 到图块 B 的距离,是 B 中的不同颜色的数量,而不是组 A 中的不同颜色的数量。
Color(G) 是一组瓷砖 G 中不同颜色的总数。
算法
1) 选择第一个图块并将其放入 Group1。
2) 如果 Colors(Group1) + d_T 小于等于某个阈值,则循环遍历所有剩余的瓦片并将具有最小组瓦片距离 d_T 的瓦片 T 放入 Group1,例如16. 重复此步骤,直到找不到这样的图块。
3) 选择下一个剩余的瓷砖并重复该过程。
如果组太多或太少,请调整阈值。
不幸的是,这不一定会产生最好的结果(可能有更大的组可能具有相同的阈值)。
是否可以更改此算法以返回最佳解决方案,或者我应该选择不同的方法?
是否有任何因素会影响 PNG 大小,而我没有考虑到这些因素?
【问题讨论】:
-
这些是被索引的PNG吗?如果它们是 RGB 或 ARGB,则“颜色数量”无关紧要。
-
它们是被索引的 PNG。显然,颜色的数量与索引 PNG 相关(每个索引条目的大小都会增长!)
-
您的方法的明显问题是:如果个别瓷砖已经使用了最大数量 (256) 的颜色怎么办?
-
你说的是 GIF 吗?据我所知PNG没有颜色限制..
-
@vincent PNG8 有 256 种颜色的限制,每个像素一个字节。 RGB/RGBA没有限制,但成本3-4Bpp。
标签: image optimization png grouping image-size