アプリに 24 ビット PNG が 250KB を超えることはできないというビジネス ロジックがある場合、画像の最大幅と高さを予測して、250KB の要件に収まるかどうかを予測できますか?
色深度、アルファチャンネルなどには多くの変数があるため、これを知ることは可能ですか? それとももっと近づく?
アプリに 24 ビット PNG が 250KB を超えることはできないというビジネス ロジックがある場合、画像の最大幅と高さを予測して、250KB の要件に収まるかどうかを予測できますか?
色深度、アルファチャンネルなどには多くの変数があるため、これを知ることは可能ですか? それとももっと近づく?
可能ですが、おそらく役に立ちません。PNG の zlib 圧縮の最大圧縮率は 1032:1 です (同じバイト値の長いシーケンスの場合)。したがって、圧縮された 250 KB は (ラッパーなどを無視して) 非圧縮で約 250 MB になります。正方形の画像の場合、これは 1 ピクセルあたり 3 バイトでほぼ 10,000 x 10,000 ピクセルになります。
ここでの別の回答は、最小のピクセル数、たとえば 500 x 333 を与える最小の圧縮を不可解に想定していることに注意してください。明らかに、10,000 x 10,000 は 500 x 333 より大きいです。
アップデート:
n
最小限の PNG ファイルに基づいて正確に計算すると、ファイル サイズのバイト数の関数として、この 24 ビット ピクセルの最大数 (圧縮データに格納されるピクセルあたり 3 バイト) が得られます。
floor(((n - 77) * 8 - 1) / 2) * 86 + 1
したがって、250*1024 = 256,000 バイトの場合、88,037,427 ピクセルになります。正方形の画像の場合、約 9383 x 9383 ピクセルになります。
PNGファイルが非圧縮であると仮定することにより、PNGファイルの最大値を予測できます。width * height * 3を乗算し、ヘッダーオーバーヘッド用のビットを追加します。
改善するには、アプリケーションの一般的なPNGファイルを多数測定し、上記の予測に対する実際のファイルサイズの比率が最も大きいファイルを見つけます。この比率または少し大きい数値を使用して、他の画像のサイズを見積もります。
これでも、結果が十分に小さいことは保証されません。実際にエンコードされた画像を書き出そうとすることによってのみ、結果を判断できます。ただし、最も退化したケースを除くすべてのケースで十分なはずです。
編集:明確でない場合は、逆方向に作業して、最大ファイルサイズから画像のサイズを取得できます。を最大許容幅と高さと仮定するw
と、はのアスペクト比であり、は上記で検出されたファイルサイズ/画像サイズの比率です。h
a
w/h
r
w = sqrt((250K * a) / (r * 3))
h = w / a
したがって、たとえば、a
が1.5でr
0.5の場合、寸法は500x333になります。
巨大な空のファイルを png として保存すると、png 圧縮のためにサイズが非常に小さくなります。
ユーザーに寸法を提供したい場合は、ファイルサイズではなく寸法に基づいて画像を受け入れるようにビジネス ロジックを変更する必要があります。