2012-02-08 234 views
2

我正在研究Android中的遊戲,並且我正在繪製Bitmap對象。他們使用Matrix類進行旋轉。我遇到的問題是能夠訪問旋轉的Bitmap的像素。當我旋轉後訪問它們時,像素仍然代表未旋轉的版本。有沒有人有任何想法?也許我可以旋轉基於任意度數的像素數組?我已經看到了基於新旋轉的圖像即時創建新位圖的解決方案,但由於性能問題,我無法做到這一點。謝謝!從旋轉位圖獲取像素Android

這裏是我目前正在繪製位圖(位圖使用矩陣作爲其位置繪製)...

canvas.drawBitmap(bitmapPlayer, positionMatrix, null); 

這裏是我創建positionMatrix變量...

Matrix m = new Matrix(); 
m.postRotate(degrees, bitmapCenterX, bitmapCenterY); 
positionMatrix.set(m); 

這裏是我訪問當前的像素(這訪問像素陣列I中創建的)...

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; 
} 
+2

請向我們顯示您的代碼。 – poitroae 2012-02-08 20:05:34

+0

@Michael我用一些代碼更新了我的帖子。 – 2012-02-08 20:17:18

回答

1

你試過:

Matrix mat = new Matrix(); 
mat.postRotate(45); 
Bitmap newBm = Bitmap.createBitmap(bitmapPlayer, 0, 0, bitmapPlayer.width(), bitmapPlayer.height(), mat, true); 

然後訪問新位圖的像素?

我覺得現在你只需在畫布上繪製一個旋轉的位圖,您實際上並不旋轉位圖

編輯:

你做你的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)。讓我知道,如果這項工作, ,如果它不能你更具體一些你認爲問題可能在哪裏?

+0

我已經做到了這一點,它是減緩我的需求的方式。我有很高的期望,當我也嘗試過時,這將是一個簡單的解決方案。它確實是我所需要的,但不幸的是在性能上出現重大損失... – 2012-02-09 01:12:33

+0

編輯 - 讓我知道如果這有幫助 – Benoir 2012-02-09 02:04:34

+0

我會試試看!謝謝你的一些想法,我很感激。我將把這個方法引入C並通過JNI訪問它,以幫助提高性能。當我有機會嘗試時,我會盡快回復您。 – 2012-02-09 14:14:23