Как изменить размер растрового изображения эффективно и без потери качества в android

у меня есть Bitmap площадью 320x480 и мне нужно растянуть его на разных экранах устройств, я попытался с помощью этого:

Rect dstRect = new Rect();
canvas.getClipBounds(dstRect);
canvas.drawBitmap(frameBuffer, null, dstRect, null);

это работает, изображение заполняет весь экран, как я хотел, но изображение пиксельное, и это выглядит плохо. Тогда я попробовал:--7-->

float scaleWidth = (float) newWidth / width;
float scaleHeight = (float) newHeight / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedBitmap = Bitmap.createBitmap(frameBuffer, 0, 0,
                width, height, matrix, true);
canvas.drawBitmap(resizedBitmap, 0, 0, null);

на этот раз он выглядит идеально, красиво и гладко, но этот код должен быть в моем основном игровом цикле и создании Bitmaps каждая итерация делает его очень медленным. Как изменить размер изображения, чтобы оно не получалось неровной и делается быстро?

НАЙДЕНО РЕШЕНИЕ:

Paint paint = new Paint();
paint.setFilterBitmap();
canvas.drawBitmap(bitmap, matrix, paint);

2 ответов


изменение размера растрового изображения:

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth)
{
    int width = bm.getWidth();
    int height = bm.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // create a matrix for the manipulation
    Matrix matrix = new Matrix();
    // resize the bit map
    matrix.postScale(scaleWidth, scaleHeight);
    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
    return resizedBitmap;
}

довольно понятно: просто введите исходный объект растрового изображения и желаемые размеры растрового изображения, и этот метод вернет вам недавно измененное растровое изображение! Может быть, это полезно для вас.


Я использую вышеуказанное решение для изменения размера растрового изображения. Но в результате часть изображения теряется.

вот мой код.

 BitmapFactory.Options bmFactoryOptions = new BitmapFactory.Options();
            bmFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
            bmFactoryOptions.inMutable = true;
            bmFactoryOptions.inSampleSize = 2;
            Bitmap originalCameraBitmap = BitmapFactory.decodeByteArray(pData, 0, pData.length, bmFactoryOptions);
            rotatedBitmap = getResizedBitmap(originalCameraBitmap, cameraPreviewLayout.getHeight(), cameraPreviewLayout.getWidth() - preSizePriviewHight(), (int) rotationDegrees);

 public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight, int angle) {
        int width = bm.getWidth();
        int height = bm.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
        DeliverItApplication.getInstance().setImageCaptured(true);
        return resizedBitmap;
    }

а вот высота и ширина изображения : Предварительный просмотр Размер поверхности: 352: 288 Перед изменением размера растрового изображения ширина: 320 высота : 240 CameraPreviewLayout ширина: 1080 Высота : 1362 Размер растрового изображения ширина: 1022 Высота: 1307