4

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を使用して、画像サイズを操作してみました。すべての試行でこれと同じ結果が得られます。ビットマップフィルタリングが有効になっています。

提案をありがとう!

4

1 に答える 1

2

Bitmap.createScaledBitmap() と Bitmap.createBitmap を Matrix で使用することは同じです。Bitmap.createScaledBitmap のソースを参照してください(これは Android 2 以降変更されていません)。

Android 4.0 以降では、マトリックス (Bitmap.createScaledBitmap のように) を使用すると、ハードウェア アクセラレーション操作が有効になっている場合 (4.1 以降の IIRC ではデフォルトで有効になっています) が可能になるため、何が行われ、どのように行われるかを直接制御することはできません。 .

つまり、目的の (ここでは線形) フィルタリングを使用して、独自のスケーリング方法を実装する必要があります。ピクセル処理による。または適切なフィルターで OpenGL ES を使用しますが、すべてのデバイスで利用できるとは限りません。

于 2013-03-09T18:42:36.293 に答える