Как эффективно изменить размер растрового изображения без потери качества в Android - PullRequest
14 голосов
/ 30 ноября 2011

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

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

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

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

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

НАЙТИ РЕШЕНИЕ:

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

Ответы [ 2 ]

34 голосов
/ 01 декабря 2011

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

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

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

0 голосов
/ 14 марта 2017

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

Вот мой код.

 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

...