1

BGRA ラスター データ (たとえば、最初のバイト = 青コンポーネント、2 番目 = 緑、5 番目 = 次のピクセル、青) を含む byte[] 配列があり、それで遊んでみたいと思います。

具体的には、このようなものをラップするように設計された Java クラスはありますか? 私は自分のコードをできるだけきちんと/正確にしたいので、Java がより高速にコンパイルされたバージョンを既に持っている場合は、それを使用するのではないかと思っています。

さらに具体的には、byte[] 配列を BGR1[] + BGR2[] = BGR、A1 = A2 = A の 2 つの配列に変換したいと考えています。何か提案はありますか?

もちろん、このために生のコードを書くこともできますが、おそらくもっときちんと/より高速な方法があります。

4

2 に答える 2

1

これが速いかどうかはわかりませんが、確かに便利です。私のソース データ配列は、 J4KSDKを使用して、Kinect のカラー ストリームから取得されました。

この方法での私の目標は、画像のバイナリ バイトを読み取ることでした。自分の用途に合わせて変更できると思います。

/* Reference imports */
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/* method */
public byte[] getImage(byte[] bytes) throws IOException {
    int width = 640;
    int height = 480;

    int[] shifted = new int[width * height];

    // (byte) bgra to rgb (int)
    for (int i = 0, j = 0; i < bytes.length; i = i + 4, j++) {
        int b, g, r;

        b = bytes[i] & 0xFF;
        g = bytes[i + 1] & 0xFF;
        r = bytes[i + 2] & 0xFF;

        shifted[j] = (r << 16) | (g << 8) | b;
    }

    BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    bufferedImage.getRaster().setDataElements(0, 0, width, height, shifted);

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(bufferedImage, "JPG", baos);
    byte[] ret = baos.toByteArray();

    return ret;
}
于 2015-07-02T19:47:38.190 に答える