2012-02-08 2 views
2

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

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

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

Пожалуйста, покажите нам свой код. – poitroae

+0

@Michael I обновил свой пост с помощью некоторого кода. –

ответ

1

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

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

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

Я думаю, что прямо сейчас вы просто нарисовать повернутый точечный рисунок на холсте, вы на самом деле не вращение растрового

EDIT:

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

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 соответственно). Дайте мне знать, если это работает, , и если вы не можете быть немного более конкретным о том, где вы думаете, проблема может быть?

+0

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

+0

Отредактировано - дайте мне знать, если это вообще поможет – Benoir

+0

Я попробую! Спасибо, что задумался над этим, я ценю это. Я постараюсь перебросить этот метод на C и получить доступ к нему через JNI, чтобы тоже помочь в производительности. Я вернусь к вам, когда у меня появится шанс попробовать. –

Смежные вопросы