从旋转位图Android获取像素

时间:2012-02-08 20:04:30

标签: java android graphics bitmap

我正在开发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;
}

1 个答案:

答案 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减去或减去)。让我知道这个是否奏效, 如果没有,你可以更具体地说明你认为问题可能在哪里吗?