Плохое качество изображения после изменения размера / масштабирования растрового изображения - PullRequest
74 голосов
/ 27 января 2011

Я пишу карточную игру, и мне нужны карты разных размеров в разных обстоятельствах. Я храню свои изображения в виде растровых изображений, чтобы их можно было быстро рисовать и перерисовывать (для анимации).

Моя проблема в том, что независимо от того, как я пытаюсь масштабировать свои изображения (будь то с помощью matrix.postScale, matrix.preScale или функции createScaledBitmap), они всегда получаются пиксельными и смазанными. Я знаю, что именно масштабирование вызывает проблему, потому что изображения выглядят идеально при рисовании без изменения размера.

Я работал над каждым решением, описанным в этих двух потоках:
качество андроид изображений, измененных во время выполнения
проблемы с качеством при изменении размера изображения во время выполнения

но до сих пор не получил нигде.

Я храню свои растровые изображения (в hashmap) с этим кодом:

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);
}

Любое понимание будет с благодарностью. Спасибо

Ответы [ 11 ]

0 голосов
/ 16 сентября 2017
private static Bitmap createScaledBitmap(Bitmap bitmap,int newWidth,int newHeight) {
        Bitmap scaledBitmap = Bitmap.createBitmap(newWidth, newHeight, bitmap.getConfig());

        float scaleX = newWidth / (float) bitmap.getWidth();
        float scaleY = newHeight / (float) bitmap.getHeight();

        Matrix scaleMatrix = new Matrix();
        scaleMatrix.setScale(scaleX, scaleY, 0, 0);

        Canvas canvas = new Canvas(scaledBitmap);
        canvas.setMatrix(scaleMatrix);
        Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
        paint.setAntiAlias(true);
        paint.setDither(true);
        paint.setFilterBitmap(true);
        canvas.drawBitmap(bitmap, 0, 0, paint);

        return scaledBitmap;

    }
...