同じサイズ(32px x 32px)のPNG画像(タイル)が約1000枚あります。それらはすべて異なって見えますが、いくつかは非常に似ています(それらは同じ色を使用します)。それぞれ約50タイルのPNG画像(ブロック)にまとめる必要があります。ブロックサイズは動的ですが、小さすぎないようにする必要があります。
私の目標は、結果のブロックのサイズを最小化することです。
ウィキペディアによると、PNGファイルのサイズはピクセルあたりの色深度に依存します。
私の考えは、各グループの色の量が最小になるようにタイルをグループ化することです。また、カラーインデックスを保存する必要があるため、各タイルをブロックとして保存することは最適なソリューションではありません。ブルートフォース攻撃を行うには非常に長い時間がかかるため、グループ化アルゴリズムの優れたスケッチを期待していました。
色の量が1、2、4、8、16、32などを超えると、ファイルサイズが「ジャンプ」すると思います。したがって、これらは注意すべきしきい値になる可能性があります。
次に、最適なソリューションを生成しないアルゴリズムをスケッチします
定義
グループタイルの距離を導入します。タイルAのグループからタイルBまでの距離は、Bにはあるが、グループAにはないさまざまな色の量です。
Color(G)は、タイルGのグループ内のさまざまな色の合計量です。
アルゴリズム
1)最初のタイルを選び、それをGroup1に入れます。
2)残りのすべてのタイルをループし、グループタイルの距離d_Tが最小のタイルTをGroup1に配置します(Colors(Group1)+ d_Tがしきい値よりも小さい場合、たとえば16)。そのようなタイルが見つからなくなるまでこの手順を繰り返します。 。
3)次に残っているタイルを選び、手順を繰り返します。
グループが多すぎるか少なすぎる場合は、しきい値を調整します。
残念ながら、これは必ずしも最良の結果をもたらすとは限りません(同じしきい値で可能なより大きなグループが存在する可能性があります)。
このアルゴリズムを変更して最適なソリューションを返すことはできますか、それとも別のアプローチを選択する必要がありますか?
PNGのサイズに影響を与える要因はありますか?私は考慮していませんでしたか?