Поворот растрового изображения Android на 90 градусов приводит к сжатому изображению. Нужен настоящий поворот между портретом и пейзажем - PullRequest
17 голосов
/ 22 декабря 2011

Я пытаюсь повернуть растровое изображение на 90 градусов, чтобы изменить его с альбомного формата на портретный. Пример:

[a, b, c, d]
[e, f, g, h]
[i, j, k, l]

повернутый на 90 градусов по часовой стрелке становится

[я, е, а]
[J, F, Ь]
[К, г, с]
[Л, ч, д]

Используя приведенный ниже код (из онлайн-примера), изображение поворачивается на 90 градусов, но сохраняет соотношение сторон в альбомной ориентации, поэтому в итоге получается сжатое по вертикали изображение. Я делаю что-то неправильно? Есть ли другой метод, который мне нужно использовать? Я также готов повернуть файл JPEG, который я использую для создания растрового изображения, если это проще.

 // create a matrix for the manipulation
 Matrix matrix = new Matrix();
 // resize the bit map
 matrix.postScale(scaleWidth, scaleHeight);
 // rotate the Bitmap
 matrix.postRotate(90);

 // recreate the new Bitmap
 Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOriginal, 0, 0, widthOriginal, heightOriginal, matrix, true); 

Ответы [ 4 ]

40 голосов
/ 31 декабря 2011

Это все, что нужно для поворота изображения:

Matrix matrix = new Matrix();
matrix.postRotate(90);
rotated = Bitmap.createBitmap(original, 0, 0, 
                              original.getWidth(), original.getHeight(), 
                              matrix, true);

В вашем примере кода вы включили вызов postScale. Может ли это быть причиной того, что ваш образ растягивается? Возможно, возьмите это и сделайте еще тестирование.

13 голосов
/ 23 декабря 2011

Вот как вы должны правильно повернуть его (это обеспечивает правильное вращение изображения)

public static Bitmap rotate(Bitmap b, int degrees) {
    if (degrees != 0 && b != null) {
        Matrix m = new Matrix();

        m.setRotate(degrees, (float) b.getWidth() / 2, (float) b.getHeight() / 2);
        try {
            Bitmap b2 = Bitmap.createBitmap(
                    b, 0, 0, b.getWidth(), b.getHeight(), m, true);
            if (b != b2) {
                b.recycle();
                b = b2;
            }
        } catch (OutOfMemoryError ex) {
           throw ex;
        }
    }
    return b;
}
0 голосов
/ 07 августа 2016

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

0 голосов
/ 23 января 2013

Этот код отлично сработал для меня:

                Matrix matrix = new Matrix();

            matrix.setRotate(90, 0, 0);
            matrix.postTranslate(original.getHeight(), 0);

            rotatedBitmap = Bitmap.createBitmap(newWidth, newHeight, original.getConfig());
            Canvas tmpCanvas = new Canvas(rotatedBitmap);
            tmpCanvas.drawBitmap(original, matrix, null);
            tmpCanvas.setBitmap(null);
...