15

Androidで画像処理をしようとしています。ビットマップのピクセル情報のチャンクを取得する必要があります。そこで、ビットマップクラスメソッドgetPixels()の1つを使用しようとしました。ただし、正しく使用していないか、メソッドの動作の唯一の目的を誤解しているようです。

たとえば、任意の場所(ビットマップ座標)x、yからビットマップの10x10領域のピクセル情報を取得するために次のことを行っています。

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はビットマップの幅と高さです。

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

誰かがこれについて何か言うことがあれば、私はそれをいただければ幸いです。ありがとう。

4

3 に答える 3

12

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

このように使用すると、bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, 10, 10);実際にはビットマップから目的のピクセルを取得し、配列の残りの部分を0で埋めます。したがって、100x10のビットマップの10x10サブセットでは、最初の100個の値は次のようになります。目的のint値の場合、残りは0になります。

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

于 2012-11-19T03:18:59.273 に答える
7

ほとんどの人は、特定の領域のピクセルを取得する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;
}
}
于 2015-11-13T09:23:10.637 に答える
0

問題は、「ストライド」をに指定したことだと思いますbitmap.getWidth()

これは、ピクセル配列の各行に予約されているスペースが10だけでなく、その幅になることを意味します。その場合、ピクセル配列を[bitmap.getWidth() * 10]だけでなく大きく割り当てる必要があります[10 * 10]

あるいは、おそらくあなたが最初にやりたかったことは、ちょうどその10のストライドを指定することでした:

bitmap.getPixels(pixels, 0, 10, x, y, 10, 10);
于 2020-03-20T18:58:54.903 に答える