[英]Get Pixels From Rotated Bitmap Android
我正在使用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;
}
你有没有尝试过:
Matrix mat = new Matrix();
mat.postRotate(45);
Bitmap newBm = Bitmap.createBitmap(bitmapPlayer, 0, 0, bitmapPlayer.width(), bitmapPlayer.height(), mat, true);
然后访问新位图的像素?
我想现在您只是在画布上绘制了一个旋转的位图,实际上并没有旋转该位图
编辑:
您在原始帖子中执行此操作的方式将不起作用,因为您从(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减去)。 让我知道这是否可行,如果不能奏效,您是否可以更具体地说明问题所在?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.