Изображение меняет размер при повороте.Как мне это остановить? - PullRequest
1 голос
/ 13 марта 2011

Я делаю игру для Android, и мне нужно повернуть изображение. Когда я поворачиваю его, очевидно, меняются его размеры. Например, когда он повернут на 45 градусов (это квадрат, но я бы хотел, чтобы это работало для любого прямоугольника, поэтому это более общее решение), его ширина и высота становятся длиной диагонали, которая длиннее оригинала. После некоторой алгебры вы можете понять, что масштабный коэффициент равен sqrt (2). Но единственный способ, которым я знаю, чтобы вращать растровое изображение, это с помощью матрицы. Пример:

matrix.postRotate(degrees);
rotated = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true);

При использовании этого метода размер растрового изображения остается постоянным, поэтому для поворота повернутого изображения в содержимое изображения необходимо его уменьшить. Что вызывает мою проблему.

То, что у меня сейчас есть, должно работать, а когда работает - нет. Вероятно, потому что это слишком сложно, тем не менее, вот оно:

     float totalRotated = 0;

public void rotate(float degrees){
    if(mBitmap != null){
        float increment = (float)((mBitmap.getWidth()/45.0)*(Math.sqrt(2)-1));
        totalRotated += degrees;
        totalRotated -= (float)((int)totalRotated/360)*360;
        matrix.reset();
        matrix.setRotate(totalRotated);
        rotated = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true);
        rotated = Bitmap.createScaledBitmap(rotated, (int)(mBitmap.getWidth()+(((Math.abs(Math.abs(((int)totalRotated%90)-45)-45)))*increment)), (int)(mBitmap.getHeight()+(((Math.abs(Math.abs(((int)totalRotated%90)-45)-45)))*increment)), true);
    }
}

Используя функцию Log.d, я смог определить, что размеры, заданные в последнем утверждении, соответствуют моим ожиданиям, но размер изображения не изменяется. Так как это даже не работает, мне нужен лучший способ сделать это или способ исправить мой метод. Также мой метод работает только для квадратов. Итак, как я могу это сделать?

EDIT: Мой метод работает, я просто не звонил setBounds() Это не может быть единственным способом сделать это, хотя это так неэффективно.

1 Ответ

1 голос
/ 13 марта 2011

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

float totalRotated = 0;

public void rotate(float degrees){
    if(mBitmap != null){
        // compute the absolute rotation
        totalRotated = (totalRotated + degrees) % 360;
        // precompute some trig functions
        double radians = Math.toRadians(totalRotated);
        double sin = Math.abs(Math.sin(radians));
        double cos = Math.abs(Math.cos(radians));
        // figure out total width and height of new bitmap
        int newWidth = mBitmap.getWidth() * cos + mBitmap.getHeight() * sin;
        int newHeight = mBitmap.getWidth() * sin + mBitmap.getHeight() * cos;
        // set up matrix
        matrix.reset();
        matrix.setRotate(totalRotated);
        // create new bitmap by rotating mBitmap
        rotated = Bitmap.createBitmap(mBitmap, 0, 0,
                                      newWidth, newHeight, matrix, true);
    }
}
...