2012-11-18 32 views
7

私はAndroidでいくつかの画像処理をしようとしています。 ビットマップのピクセル情報を取得する必要があります。 私はBitmapクラスのgetPixels()メソッドの1つを使用しようとしました。 しかし、私は正しく使用していないか、メソッドの動作の唯一の目的を誤解しているようです。AndroidのBitmapクラスの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、width、heightはビットマップの幅と高さです。

ビットマップのgetPixels()は私の目的のために設計されていません(ビットマップのサブ領域のピクセル情報の塊を得る)か?または私はそれを間違って使用していますか?おそらく別のクラスを使用して、これを行う別の方法がありますか?

誰かがこれについて何か言いたいのであれば、私はそれを感謝します。ありがとう。

答えて

4

getPixels()は、ソースビットマップの完全なint []配列を返します。したがって、ソースビットマップの高さx幅と同じ長さで初期化する必要があります。

bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, 10, 10);は、ビットマップから実際に目的のピクセルを取得し、残りの配列を0で埋めます。ビットマップの100 x 10のサブセットが0,0で始まる10 x 10サブセット最初の100の値が望ましいint値になり、残りは0になります。

Bitmap.createBitmap()を使用してサブセットビットマップを作成し、次に新しいビットマップでgetPixels()を使用して完全な配列を取得できます。

+0

私はgetPixels()は常に全体のソースビットマップの配列のサイズを返すという事実によって、非常に驚​​いているものの、あなたの有益なアドバイスをありがとう。 –

+1

は、getPixelよりもgetPixelをスピードの点で使用していますか? –

+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; 
} 
} 
関連する問題