簡體   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