我有大约 1000 个相同大小(32 像素 x 32 像素)的 PNG 图像(图块)。它们看起来都不同,但有些非常相似(它们使用相同的颜色)。我必须将它们总结为 PNG 图像(块),每个图像大约有 50 个图块。块大小是动态的,但不应太小。
我的目标是最小化生成的块的大小。
维基百科告诉我,PNG 文件的大小取决于每个像素的颜色深度。
我的想法是对瓷砖进行分组,使每个组的颜色最少。还需要存储颜色索引,因此将每个图块保存为块不是最佳解决方案。进行蛮力运行需要很长时间,所以我希望有一个分组算法的好草图。
我假设当颜色数量超过 1、2、4、8、16、32 等时,文件大小会“跳跃”。所以这些可能是需要注意的门槛。
我现在将绘制一个不会产生最优解的算法
定义
引入组瓷砖距离。一组图块 A 到图块 B 的距离是 B 中不同颜色的数量,但不是组 A。
颜色(G)是一组瓷砖 G 中不同颜色的总数。
算法
1) 选择第一块瓷砖并将其放入 Group1。
2) 循环遍历所有剩余的瓦片并将具有最小组瓦片距离 d_T 的瓦片 T 放入 Group1,如果 Colors(Group1) + d_T 小于某个阈值,例如 16。重复此步骤直到找不到这样的瓦片.
3)选择下一个剩余的瓷砖并重复该过程。
如果组太多或太少,请调整阈值。
不幸的是,这不一定会产生最佳结果(可能有更大的组可能具有相同的阈值)。
可以更改此算法以返回最佳解决方案还是我应该选择不同的方法?
是否有任何因素会影响我没有考虑的 PNG 大小?