2

SQLiteDatabase から画像 (.png) を取得し、このコードを使用して bytearray をビットマップにデコードしています。

Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inDither = true;
options.inScaled = true;
options.inDensity = 240;
options.inTargetDensity = metrics.densityDpi;
Bitmap bmp = BitmapFactory.decodeStream(new ByteArrayInputStream(imageAsBytes), null, options);

ご覧のとおり、画像 (3) は (2) のようになるはずですが、そうではありません。

1) オリジナル= 縮尺なしの画像 (metrics.densityDpi = 240);

2) ドローアブル リソースから= 上記と同じ .png ですが、res/drawable でコンパイルされています。

3) ダウンスケールから= ダウン スケールのイメージ (metrics.densityDpi = 120);

も試しoptions.inDither = false;ましたが、違いはわかりません。

では、私のコードの何が問題なのですか?

4

2 に答える 2

0

簡単に言うと、最高品質のダウンスケーリング アルゴリズムは 2 つのステップで構成されます。

  1. BitmapFactory.Options::inSampleSize->BitmapFactory.decodeResource()を使用して、必要な解像度にできるだけ近いが、それ未満ではない解像度にダウンスケールします
  2. Canvas::drawBitmap()を使用して少しダウンスケーリングすることで、正確な解像度を取得します。

SonyMobile がこのタスクをどのように解決したかについて詳しく説明します: http://developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/

SonyMobile スケール ユーティリティのソース コードは次のとおりです: http://developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-for-android/

于 2014-04-21T01:42:00.687 に答える
0

他にもいくつか試してみます。

  1. スケールなしで png をロードします。イメージを描画するときに (ImageView 内から、またはキャンバスに直接)、Matrixを設定してイメージをスケーリングします。

  2. または、必要な密度でイメージをロードし、ペイントオブジェクトを使用してビットマップをキャンバスに直接描画してみてください。ペイントをインスタンス化した後、ビットマップ フィルタリングを有効にします (これにより画質が向上します)。

    setFilterBitmap(true) 
    
  3. 最後に、ビットマップ (密度に依存しない) をいつでもロードし、Bitmap.createScaledBitmapを使用して手動でビットマップのサイズを変更できます。3 番目のパラメーターを true に設定してください (これにより、ビットマップ フィルタリングが有効になり、品質が向上します)。以下は、100 が目的のサイズであるビットマップのスケーリングの例です。

    Bitmap.createScaledBitmap ( original_bitmap, 100, 100, true);
    
于 2012-07-18T14:05:11.230 に答える