繁体   English   中英

从Android的旋转位图获取像素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM