Androidで画像をきれいに縮小するのに問題があります。小さなPNG画像を元のサイズの約10〜100%の任意のサイズに拡大縮小したいと考えています。
問題を示し、Androidのイメージスケーラーで見られる異常な動作を悪化させるサンプル画像を作成しました。
上の画像は、いくつかの注釈が追加されたAndroidデバイスのスクリーンショットです。また、左側の2番目の列に同じ画像を追加して、「GIMP」(GNU画像操作プログラム)による線形スケーリングでどのようにレンダリングされるかを示しています。
ベース画像は、赤と青のピクセルの市松模様の背景で構成されています。その背景に、幅1pxの黄色い線とかなり細い緑色のテキストを描画しました。画像は288x288ピクセルです。
画像を元のサイズの1/3に拡大縮小すると、Androidは9ピクセルに1つを取得し、他のすべてのデータを破棄するように見えます。その結果、黄色い線の一部が完全に消えます。驚くべきことに、チェッカーボードのパターンはそのまま残ります(これは単に3番目のピクセルが使用された結果です)。
画像を元のサイズの50%に近いが、正確には50%に拡大しない場合、たとえば、142x142または143x143の場合、スケーラーは画像にかなり大きな異常/アーティファクトを作成します。
50%のサイズ(144x144)では、画像は正しく見えます。
テスト画像は最悪の画像スケーラーを引き出しますが、「通常の」PNGアイコン画像も深刻な影響を受けます。10〜33%程度では、画像が適切にリサンプリングされないため、非常に「ビットマップ」されたように見えます。また、特定の大きなサイズの画像には、特定のサイズで非常に奇妙な異常があります。
パフォーマンスを犠牲にしても、この奇妙なスケーリング動作を無効にする方法を誰かが知っているなら、それについて知っていただければ幸いです。ビットマップのピクセルに直接作用するアルゴリズムを書くことで確かに解決できますが、それが唯一の選択肢ではないことを願っています。
また、すべての画像作業がARGB_8888Bitmap.Configsで行われているという事実も注目に値します。ImageViewsでmaxwidth/maxheightを設定し、Bitmap.createScaledBitmap()を使用し、MatrixでBitmap.createBitmapを使用して、画像サイズを操作してみました。すべての試行でこれと同じ結果が得られます。ビットマップフィルタリングが有効になっています。
提案をありがとう!