2012-02-08 176 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); 

这里是我访问当前的像素(这访问像素阵列I中创建的)...

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 2012-02-08 20:05:34

+0

@Michael我用一些代码更新了我的帖子。 – 2012-02-08 20:17:18

回答

1

你试过:

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

然后访问新位图的像素?

我觉得现在你只需在画布上绘制一个旋转的位图,您实际上并不旋转位图

编辑:

你做你的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

我已经做到了这一点,它是减缓我的需求的方式。我有很高的期望,当我也尝试过时,这将是一个简单的解决方案。它确实是我所需要的,但不幸的是在性能上出现重大损失... – 2012-02-09 01:12:33

+0

编辑 - 让我知道如果这有帮助 – Benoir 2012-02-09 02:04:34

+0

我会试试看!谢谢你的一些想法,我很感激。我将把这个方法引入C并通过JNI访问它,以帮助提高性能。当我有机会尝试时,我会尽快回复您。 – 2012-02-09 14:14:23