【问题标题】:Get Pixels From Rotated Bitmap Android从旋转位图 Android 获取像素
【发布时间】: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


【解决方案1】:

你试过了吗:

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 中添加还是减去)。让我知道这个是否奏效, 如果不能,您能否更具体地说明您认为问题可能出在哪里?

【讨论】:

  • 我已经这样做了,这是为了满足我的需求。当我也尝试过时,我寄予厚望,这将是一个简单的解决方案。它完全符合我的需要,但不幸的是在性能上有重大损失......
  • 已编辑——如果有帮助请告诉我
  • 我试试看!感谢您投入一些想法,我很感激。我会将此方法放入 C 中并通过 JNI 访问它以帮助提高性能。当我有机会尝试时,我会回复你。
  • 没问题——你可能会通过舍入等跳过像素,或者将其他像素计算两次。它需要有多准确?像素数据需要做什么?
  • 是的,我知道它不会是完美的,我想一段时间后它会完全搞砸,但我需要尝试一下。我希望使它非常准确。我的游戏有一些尖锐的图像与更大的图像发生冲突,我需要它非常精确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多