-1

Javaの内容はC#PixelFormatのメンバーと一致します。

つまり、Format24bppRgbは?に一致しBufferedImage.TYPE_INT_RGBます

これが私のコードです。.Netの画像を取得しましたPixelFormat = Format32bppArgb。私は次のようにBufferedImageを作成しています:

        int sizeBytes = width * height;
        DataBufferByte dataBuffer = new DataBufferByte(myImageBytes, sizeBytes);

        WritableRaster raster = Raster.createInterleavedRaster(dataBuffer, // dataBuffer
                width, // width
                height, // height
                width * 4, // scanlineStride
                4, // pixelStride
                new int[]{0, 1, 2, 3}, // bandOffsets
                null); // location

        java.awt.image.ColorModel colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), // ColorSpace
                new int[]{8, 8, 8, 8}, // bits
                true, // hasAlpha
                false, // isPreMultiplied
                ComponentColorModel.TRANSLUCENT, DataBuffer.TYPE_BYTE);

        BufferedImage result = new BufferedImage(colorModel, raster, false, null);

bufferedImageを作成した後、赤と青の色が入れ替わります。

次に、次のように画像を作成してみました

        BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
        WritableRaster r = result.getRaster();
        int[] pixels = byteToInt(bytes);
        r.setPixels(0, 0, width, height , pixels); // ! Here an exception occures, because after I converted the byte array to int one the width becomes too long.

バイト配列はこの方法で変換されました

private int[] byteToInt(byte[] pixels) {
    int[] ints = new int[pixels.length / 3];
    int byteIdx = 0;
    for (int pixel = 0; pixel < ints.length; pixel++) {
        int red = (int) pixels[byteIdx++] & 0xFF;
        int green = (int) pixels[byteIdx++] & 0xFF;
        int blue = (int) pixels[byteIdx++] & 0xFF;
        int rgb = (red << 16) | (green << 8) | blue;
        ints[pixel] = rgb;
    }
    return ints;
}

今は色がきれいに見えますが、例外があります

java.lang.ArrayIndexOutOfBoundsException: 27600
at sun.awt.image.ByteInterleavedRaster.setPixels(ByteInterleavedRaster.java:1106)

小さい幅(幅/ 3など)を使用すると、色はきれいに見えますが、画像自体は縮小します。

4

1 に答える 1

2

BufferedImage間違いなく開始するのに適した場所です。の値の多くは、の値PixelFormatと一致します。BufferedImageそれぞれに 24 ビットと 32 ビットの RGB/ARGB 値があり、両方とも 5-5-5 と 5-6-5 の組み合わせなどがあります。

問題が発生した場合は、いくつかのコードを投稿してください。私たちがそれを確認します。助けてください。私がお勧めするのは、int期待どおりの結果が得られるまでバイト順 (ピクセル s 単位) をBufferedImageいじることです。

ピクセル値に int[] の配列がある場合、これは通常、配列を画像として表示するために使用するコードです...

int[] pixels;
ColorModel model = new DirectColorModel(32,0x00ff0000,0x0000ff00,0x000000ff,0xff000000);
Image image = new JLabel().createImage(new MemoryImageSource(width,height,model,pixels,0,width));
于 2012-04-28T06:02:53.153 に答える