Получите пиксели из повернутого растрового изображения Android - PullRequest
2 голосов
/ 09 февраля 2012

Я работаю над игрой в Android, и у меня нарисовано Bitmap объектов. Они вращаются с использованием класса Matrix. У меня проблема в том, что я могу получить доступ к пикселям повернутого Bitmap. Когда я получаю к ним доступ после поворота, пиксели все еще представляют не повернутую версию. У кого-нибудь есть какие-либо идеи? Может быть, я могу повернуть массив пикселей на произвольное количество градусов? Я видел решения, которые на лету создают новые растровые изображения на основе вновь повернутых изображений, но я не могу этого сделать из-за проблем с производительностью. Спасибо!

Вот как я сейчас рисую растровое изображение (Растровое изображение рисуется с использованием матрицы в качестве своей позиции) ...

canvas.drawBitmap(bitmapPlayer, positionMatrix, null);

Вот как я создаю переменную positionMatrix ...

Matrix m = new Matrix();
m.postRotate(degrees, bitmapCenterX, bitmapCenterY);
positionMatrix.set(m);

Вот как я в настоящее время обращаюсь к пикселям (Это открывает массив пикселей, который я создал ниже) ...

getPixel(x, y);

Вот как я строю массив пикселей, который я пытался изменить ...

// Build pixel 2d array
pixelData = new int[bitmapPlayer.getWidth()][bitmapPlayer.getHeight()];

for(int x=0; x<bitmapPlayer.getWidth(); x++) {
    for(int y=0; y<bitmapPlayer.getHeight(); y++) {
        pixelData[x][y] = bitmapPlayer.getPixel(x, y);
    }
}

Вот как я пытался манипулировать массивом *

public void rotatePixels(int degrees) {
    int[][] newPixelData = new int[bitmapPlayer.getWidth()][bitmapPlayer.getHeight()];

    double cos = Math.cos(Math.toRadians(degrees));
    double sin = Math.sin(Math.toRadians(degrees));

    for(int x=0; x<bitmapPlayer.getWidth(); x++) {
        for(int y=0; y<bitmapPlayer.getHeight(); y++) {
            if(pixelData[x][y] != 0) {
                int currentX = x + getTopLeftX();
                int currentY = y + getTopLeftY();

                int nextX = (int)((currentX * cos) - (currentY * sin));
                int nextY = (int)((currentX * sin) + (currentY * cos));

                if(nextX >= 0 && nextX < bitmapPlayer.getWidth() && nextY >= 0 && nextY < bitmapPlayer.getHeight()) {
                      newPixelData[nextX][nextY] = 1;
                }
            }
        }
    }

    this.pixelData = newPixelData;
}

1 Ответ

1 голос
/ 09 февраля 2012

Вы пробовали:

Matrix mat = new Matrix();
mat.postRotate(45);
Bitmap newBm = Bitmap.createBitmap(bitmapPlayer, 0, 0, bitmapPlayer.width(), bitmapPlayer.height(), mat, true);

и затем доступ к пикселям нового растрового изображения?

Я думаю, что сейчас вы просто рисуете повернутое растровое изображение на холсте, вы не вращаете растровое изображение

EDIT:

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

Bitmap bm = someImage;
int startx, starty;
int degree = rotateDegree % 360; // counterclockwise
if (degree >= 0 && degree < 90) {
    startx = bm.getWidth();
    starty = 0;
} else if (degree >= 90 && degree < 180) {
    startx = bm.getWidth();
    starty = bm.getWidth();
} else if (degree >= 180 && degree < 270) {
    startx = 0();
    starty = bm.getWidth();
} else {
    startx = 0;
    starty = 0;
}

А затем попробуйте пройти изображение таким образом, начиная с (startx, starty) и добавление или вычитание правильного угла (вы можете использовать некоторые логические, чтобы отслеживать ли вы добавляете или вычитаете из x или y соответственно). Дайте мне знать, если это работает, а если нет, то можете ли вы немного более точно определить, где, по вашему мнению, может быть проблема?

...