2012-11-18 112 views
7

我想在Android中執行一些圖像處理。 我需要得到一塊位圖的像素信息。 所以我試圖使用Bitmap類方法getPixels()之一。 但是,好像我沒有正確使用它,或者我誤解了該方法行爲的唯一目的。使用Android的位圖類的getPixels()以及如何使用它

例如,爲了從任意位置(位圖座標)x,y獲取位圖10×10區域的像素信息,我正在進行以下操作。

Bitmap bitmap = BitmapFactory.decodeFile(filePath); 
int[] pixels = new int[100]; 
bitmap.getPixels(pixels, 0, bitmap.getWidth(), x, y, 10, 10); 

而我得到ArrayIndexOutOfBoundsException。 我一直在谷歌搜索,看看我做錯了什麼,但我很無能。 有關使用getPixels()的大多數示例或問題通常用於提取整個圖像的像素信息的情況。因此,int數組的大小通常是bitmap.getWidth()* bitmap.getHeight(),x和y值是0,0,寬度和高度是位圖的寬度和高度。

位圖的getPixels()不是爲我的目的而設計的(獲取位圖的子區域的像素信息塊)?或者我使用不正確?有沒有其他方法可以做到這一點,也許使用不同的類?

如果有人對此有話要說,我將不勝感激。謝謝。

回答

4

getPixels()返回源位圖的完整int []數組,因此必須使用與源位圖的height x width相同的長度進行初始化。

使用像這樣,bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, 10, 10);實際上確實從位圖抓取所需的像素,並用0填充剩餘的數組。因此,對於100 x 10位圖的10 x 10子集,從0,0開始,前100個值將是所需的int值,其餘爲0.

您可以隨時嘗試使用Bitmap.createBitmap()創建您的子集位圖,然後在您的新位圖上使用getPixels()來獲取完整的數組。

+0

雖然我的事實,的getPixels()總是返回整個位圖的數組大小頗爲驚訝,感謝您提供有用的建議。在速度方面, –

+1

是否比getPixel更好地使用getPixels? –

+0

我從2017年開始,現在我不確定它是否會返回整個位圖。我試着將像素數組的大小設置爲stride * heignt值(傳遞給getPixels的參數)並且它工作正常。我通過使用逐漸減小的像素數組大小的循環測試來獲得此值 – FrinkTheBrave

3

大多數人想使用getPixels()獲取特定區域的像素,但實際上它返回了原始位圖的完整大小。有效區域位於左上角,其他半透明顏色。我建議您使用Android Studio調試模式通過創建位圖來查看視覺像素。

而以下是我的版本的getPixels()來獲得特定區域的像素:

public class BitmapHelper { 

public static int[] getBitmapPixels(Bitmap bitmap, int x, int y, int width, int height) { 
    int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()]; 
    bitmap.getPixels(pixels, 0, bitmap.getWidth(), x, y, 
      width, height); 
    final int[] subsetPixels = new int[width * height]; 
    for (int row = 0; row < height; row++) { 
     System.arraycopy(pixels, (row * bitmap.getWidth()), 
       subsetPixels, row * width, width); 
    } 
    return subsetPixels; 
} 
} 
相關問題