2

やあ。この形式のrgb値が必要です。1dベクトルでは、最初にR値、次にG値、次にB値が必要です。私はこのコードを使おうとしました:

pixels = new int[bitmap.getHeight() * bitmap.getWidth()];
        bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0,
                bitmap.getWidth(), bitmap.getHeight());
        // int R, G, B,Y;
        for (int y = 0; y < bitmap.getHeight(); y++) {
            for (int x = 0; x < bitmap.getWidth(); x++) {
                int index = y * bitmap.getHeight() + x;
                int R = (pixels[index] >> 16) & 0xff; // bitwise shifting
                int G = (pixels[index] >> 8) & 0xff;
                int B = pixels[index] & 0xff;

                // R,G.B - Red, Green, Blue
                // to restore the values after RGB modification, use
                // next statement
                pixels[index] = 0xff000000 | (R << 16) | (G << 8) | B;
            }
        }

        bitmap.recycle();
    } catch (NullPointerException exception) {
        Log.e("Error Utils",
                "Photo is damaged or does not support this format!");
    }
    return pixels;

しかし、私はまだ300 *2001dアレイしか持っていません。300 * 200 * 3 1dアレイではありません!

4

1 に答える 1

0

多分それはあなたがやろうとしていることです

public static int[] getPixel(Bitmap bitmap) {
    final int width = bitmap.getWidth();
    final int height = bitmap.getHeight();

    int[] pixelIn = new int[width * height];
    bitmap.getPixels(pixelIn, 0, width, 0, 0, width, height);
    bitmap.recycle();

    int[] pixelOut = new int[width * height * 3];
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int index = y * height + x;
            int R = (pixelIn[index] >> 16) & 0xff;
            int G = (pixelIn[index] >>  8) & 0xff;
            int B = (pixelIn[index] >>  0) & 0xff;

            int indexOut = index * 3;
            pixelOut[indexOut++] = R;
            pixelOut[indexOut++] = G;
            pixelOut[indexOut  ] = B;
        }
    }
    return pixelOut;
}

テストされていませんが、満たされているint[](考慮する必要があります)を作成する必要がありますbyte[][R][G][B][R][G][B]...


バイトも同じ

public static byte[] getPixelBytes(Bitmap bitmap) {
    final int width = bitmap.getWidth();
    final int height = bitmap.getHeight();
    final int total = width * height;

    int[] pixelIn = new int[total];
    bitmap.getPixels(pixelIn, 0, width, 0, 0, width, height);
    bitmap.recycle();

    byte[] pixelOut = new byte[total * 3];
    int indexOut = 0;
    for (int pixel : pixelIn) {
        byte R = (byte) ((pixel >> 16) & 0xff);
        byte G = (byte) ((pixel >>  8) & 0xff);
        byte B = (byte) ((pixel      ) & 0xff);
        pixelOut[indexOut++] = R;
        pixelOut[indexOut++] = G;
        pixelOut[indexOut++] = B;
    }
    return pixelOut;
}

そして、次のように3つの別々の配列で取得するには[R R R R][G G G G][B B B B]

public static byte[][] getPixelBytes(Bitmap bitmap) {
    final int width = bitmap.getWidth();
    final int height = bitmap.getHeight();
    final int total = width * height;

    int[] pixelIn = new int[total];
    bitmap.getPixels(pixelIn, 0, width, 0, 0, width, height);
    bitmap.recycle();

    byte[][] result = new byte[3][total];
    int index = 0;

    for (int pixel : pixelIn) {
        byte R = (byte) ((pixel >> 16) & 0xff);
        byte G = (byte) ((pixel >>  8) & 0xff);
        byte B = (byte) ((pixel      ) & 0xff);
        result[0][index] = R;
        result[1][index] = G;
        result[2][index] = B;
        index++;
    }
    return result;
}

5 番目 (= インデックス 4) のピクセルの RGB 値は次のようになります。

byte R = result[0][4];
byte G = result[1][4];
byte B = result[2][4];

またはそれを3つの配列に分ける

byte[] rArray = result[0]; // each 0 .. (width x height - 1)
byte[] gArray = result[1];
byte[] bArray = result[2];

byteまた、Javaは0 .. 255ではなく-128 .. 127であることを忘れないでください。

于 2012-11-30T18:05:47.933 に答える