【发布时间】:2012-02-08 20:04:29
【问题描述】:
我正在开发一款 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;
}
【问题讨论】:
-
@Michael 我用一些代码更新了我的帖子。
标签: java android graphics bitmap