2012-04-28 13 views
-1

Javaの何がC#PixelFormat'sのメンバーと一致しますか?.Net PixelFormatにはJavaに相当するものがありますか?

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

ここに私のコードです。私は赤と青の色がそれにスワップされる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を作成しています。ネットのピクセルフォーマット= Format32bppArgb を持っている画像を得ました。

次に、私は

 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)を使用すると、色はよく見えますが、画像自体は小さくなります。

私はこの問題を抱えています。どんな助けもありがとうございます。ありがとう。

+0

私は通常、画像として配列を表示するために使用するコードですまたはそれがもはや有効でない場合は、誰もが問題が解決されたことを知るように、最も適切な回答を選択するために「チェック」してください。ありがとう。 – wattostudios

答えて

1

BufferedImageは間違いなく開始するのに適しています。 PixelFormatの値の多くはBufferedImageの値と一致します。これらの値はそれぞれ24ビットと32ビットのRGB/ARGB値を持ち、どちらも5-5-5と5-6-5の組み合わせです。

あなたが問題を抱えている場合は、コードを記入して、見てみましょう。期待した結果が得られるまでバイトオーダリング(ピクセルints)で再生することをお勧めします。BufferedImageをJPanelのようなGUIオブジェクトに描画してみてください。あなたの質問が回答されている場合は、[]あなたのピクセル値のために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)); 
+0

答えに感謝します。私は自分のコードで投稿を更新しました。 bufferedImageを作成した後、赤と青の色が入れ替えられます – nixspirit

+0

私は間違いなく 'byte []'を 'int []'に変換するあなたの最新のアプローチを提案します - これは私が前に取ったアプローチです。イメージを生成するために通常使用するコードを追加しました。それ以外の場合は、あなたの幅と高さが正しくないことをお勧めします。 – wattostudios

関連する問題