1. ホーム
  2. android

ビットマップをリサイズ/スケーリングした後の画質が悪い

2023-10-03 07:48:43

質問

私はカードゲームを書いていて、異なる状況で異なるサイズのカードが必要です。私は画像をビットマップとして保存し、すばやく描画したり再描画したりできるようにしています (アニメーションのため)。

私の問題は、画像をどのように拡大縮小しようとしても (matrix.postScale, matrix.preScale, または createScaledBitmap 関数のいずれか)、常にピクセル化されてぼやけた画像になることです。画像はリサイズせずに描画されると完璧に見えるので、問題を引き起こしているのはスケーリングであることは分かっています。

これらの 2 つのスレッドで説明されているすべての解決策を実行しました。

実行時にリサイズされる画像のアンドロイド品質

実行時に画像をリサイズする際の品質問題

が、まだ埒が明きません。

私はこのコードでビットマップを(ハッシュマップに)保存しています。

cardImages = new HashMap<Byte, Bitmap>();
cardImages.put(GameUtil.hearts_ace, BitmapFactory.decodeResource(r, R.drawable.hearts_ace));

で、このメソッドで描画します(Cardクラスで)。

public void drawCard(Canvas c)
{
    //retrieve the cards image (if it doesn't already have one)
    if (image == null)
        image = Bitmap.createScaledBitmap(GameUtil.cardImages.get(ID), 
            (int)(GameUtil.standardCardSize.X*scale), (int)(GameUtil.standardCardSize.Y*scale), false);

        //this code (non-scaled) looks perfect
        //image = GameUtil.cardImages.get(ID);

    matrix.reset();
    matrix.setTranslate(position.X, position.Y);

    //These methods make it look worse
    //matrix.preScale(1.3f, 1.3f);
    //matrix.postScale(1.3f, 1.3f);

    //This code makes absolutely no difference
    Paint drawPaint = new Paint();
    drawPaint.setAntiAlias(false);
    drawPaint.setFilterBitmap(false);
    drawPaint.setDither(true);

    c.drawBitmap(image, matrix, drawPaint);
}

どんな洞察でも、非常に高く評価されます。ありがとうございます。

どのように解決するのですか?

リソースからビットマップを読み込む際のスケーリングを無効にするまで、低い画面解像度では画像が不鮮明になっていました。

Options options = new BitmapFactory.Options();
    options.inScaled = false;
    Bitmap source = BitmapFactory.decodeResource(a.getResources(), path, options);