Как изменить размер изображения с нестандартного размера

Мне нужно изменить размер изображения с нестандартным размером. Изображение взято с камеры или галереи устройства, я устал от приведенного ниже кода, но изображение растянуто, мне нужно изображение в квадратной форме без какого-либо растяжения.

public Bitmap decodeSampledBitmapFromFile(Bitmap bm, int boundBoxInDp) {
boundBoxInDp=300;
        int height = bm.getHeight();
        int width = bm.getWidth();
        float scaleWidth = ((float) boundBoxInDp) / width;
        float scaleHeight = ((float) boundBoxInDp) / height;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
                matrix, false);
        return resizedBitmap;

    }

3 ответа

Это не поместит ваше изображение в ограничивающий прямоугольник (отказ от которого, по-видимому, и называется "растянуть"). Он не будет обрабатывать прямоугольные растровые изображения в вашей квадратной ограничительной рамке, а также не будет обрабатывать изображения, которые меньше, чем ограничивающей рамки. Вы, вероятно, хотите что-то вроде:

public Bitmap decodeSampledBitmapFromFile(Bitmap bm, int boundBoxInDp) {
    boundSquareInPx=convertToPixels(300);
    int maxDimen = Math.max(bm.getHeight(), bm.getWidth())
    float scale = (maxDimen <= boundSquareInPx) ? 1 : boundSquareInPx / (float) maxDimen;
    float scaleWidth = scale * bm.getWidth();
    float scaleHeight = scale * bm.getHeight();
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
            matrix, true);
    return resizedBitmap;

}

Несколько замечаний: если ваше изображение меньше вашей границы, оно не подойдет - очевидные модификации делают это.

Во-вторых, dp!= Px; Bitmap объект возвращает px, поэтому вам придется преобразовать его в px из dp (что хорошо описано в других местах).

использование postTranslate(...) если вам нужно центрировать соответственно обрезанное растровое изображение.

Документация здесь; это уже лучшая библиотека, которую я знаю по изменению размера в Android - мне больше ничего не нужно, и я давно в игре и часто с этим работаю.

Если вам нужно, на мой взгляд, лучшее введение в эффективную работу с API: прочитайте исходный код ImageView и Drawable экземпляры; действительно стоящее личное занятие по развитию было бы использовать SDK для реализации рисования переходов с замиранием, которое обрезается по центру, так как это довольно досадно, единственная вещь, отсутствующая в библиотеке Android, и включало бы в себя множество подобных вещей. кодирование вы пытаетесь сделать выше.

NB:

Как вы заметите, другой ответчик указал на существование createScaledBitmap, что, вероятно, гораздо более понятный код; Я просто хотел указать, как то, что вы делаете, было в принципе правильно и как это можно улучшить.

Лучший.

Если у вас уже есть растровое изображение, вы можете использовать следующий код для изменения размера:

Bitmap originalBitmap = <original initialization>;

Bitmap resizedBitmap = Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, false);

Или вы можете использовать следующую библиотеку для изменения размера изображения

https://github.com/biokys/cropimage

Другие вопросы по тегам