我正在开发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;
}
答案 0 :(得分:1)
你试过了吗?
Matrix mat = new Matrix();
mat.postRotate(45);
Bitmap newBm = Bitmap.createBitmap(bitmapPlayer, 0, 0, bitmapPlayer.width(), bitmapPlayer.height(), mat, true);
然后访问新Bitmap的像素?
我想现在你只是在画布上绘制一个旋转的位图,你实际上并没有旋转位图
编辑:
你在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减去或减去)。让我知道这个是否奏效, 如果没有,你可以更具体地说明你认为问题可能在哪里吗?