2017-03-05 19 views
3

私はthisので、受け入れられた答えのコードを使用しました。今、私はBufferedImageに戻したい(できればsetRGB()ではない)。2Dピクセル配列をBufferedImageに変換する

private BufferedImage createImage(int[][] pixelData, BufferedImage outputImage){ 
    final int[] outputImagePixelData = ((DataBufferInt) outputImage.getRaster().getDataBuffer()).getData(); 
    System.arraycopy(pixelData, 0, outputImagePixelData, 0, pixelData.length); 
    return outputImage; 
} 

を、それがパラメータではなく、2次元配列として1次元配列がかかるので、それは動作しません:私はこれを試してみました。代わりSystem.arraycopyを使用する

答えて

2

あなたoutputImageはすでに良いタイプと形式を持っている場合、あなたは、単にループを使用して2D 1Dへの変換を行うことができます(ご使用のアレイエンコードが[nbRows] [RowLength]であると仮定した場合):

private BufferedImage createImage(int[][] pixelData, BufferedImage outputImage) 
    { 
    int[] outputImagePixelData = ((DataBufferInt) outputImage.getRaster().getDataBuffer()).getData() ; 

    final int width = outputImage.getWidth() ; 
    final int height = outputImage.getHeight() ; 

    for (int y=0, pos=0 ; y < height ; y++) 
     for (int x=0 ; x < width ; x++, pos++) 
      outputImagePixelData[pos] = pixelData[y][x] ; 

    return outputImage; 
    } 

しかし、 INT型はBufferedImageで実際にはよく定義されていません。デフォルトでは、TYPE_INT_RGBとTYPE_INT_ARGBがあり、ピクセルエンコーディングのR、G、B、A値を1つのINTに連結します。あなたは、単一のチャネルを持つint型のグレーレベルのBufferedImageを作成したい場合は、実行する必要があります。

private BufferedImage createImage(int[][] pixelData) 
    { 
    final int width = pixelData[0].length ; 
    final int height = pixelData.length ; 
    // First I create a BufferedImage with a DataBufferInt, with the appropriate dimensions and number of channels/bands/colors 
    ColorSpace myColorSpace = new FloatCS(ColorSpace.TYPE_GRAY, channel) ; 
    int[] bits = new int[]{32} ; 
    ColorModel myColorModel = new ComponentColorModel(myColorSpace,bits,false,false,ColorModel.OPAQUE,DataBuffer.TYPE_INT) ; 
    BufferedImage outputImage = new BufferedImage(myColorModel, myColorModel.createCompatibleWritableRaster(width, height), false, null) ; 

    int[] outputImagePixelData = ((DataBufferInt) outputImage.getRaster().getDataBuffer()).getData() ; 

    for (int y=0, pos=0 ; y < height ; y++) 
     for (int x=0 ; x < width ; x++, pos++) 
      outputImagePixelData[pos] = pixelData[y][x] ; 

    return outputImage ; 
    } 

FloatCSはColorSpaceクラスであることで。ラボ、HLSなどの特定のColorSpaceが必要な場合は、独自のColorSpaceクラスを作成する必要があります。

public class FloatCS extends ColorSpace 
{ 

private static final long serialVersionUID = -7713114653902159981L; 

private ColorSpace rgb = ColorSpace.getInstance(ColorSpace.CS_sRGB) ; 

public FloatCS(int type, int channel) 
    { 
    super(type, channel) ; 
    } 


@Override 
public float[] fromCIEXYZ(float[] pixel) 
    { 
    return fromRGB(rgb.fromCIEXYZ(pixel)) ; 
    } 

@Override 
public float[] fromRGB(float[] RGB) 
    { 
    return RGB ; 
    } 

@Override 
public float[] toCIEXYZ(float[] pixel) 
    { 
    return rgb.toCIEXYZ(toRGB(pixel)) ; 
    } 

@Override 
public float[] toRGB(float[] nRGB) 
    { 
    return nRGB ; 
    } 
} 
+0

'FloatCS'クラスとは何ですか? –

+0

申し訳ありませんが、私はそれを忘れました。ここにあります。 – FiReTiTi

1

、あなたは、単に二重for -loopを使用しx/yを反復することができ、このようなもの:

private BufferedImage createImage(int[][] pixelData, BufferedImage outputImage) { 
    int[] outputImagePixelData = ((DataBufferInt) outputImage.getRaster().getDataBuffer()).getData(); 

    int width = outputImage.getWidth(); 
    int height = outputImage.getHeight(); 

    for (int y = 0; y < height; y++) { 
     for (int x = 0; x < width; x++) { 
      outputImagePixelData[y * width + x] = pixelData[x][y]; 
     } 
    } 

    return outputImage; 
} 

上記のコードでは、(1つの配列要素は、一つの画素要素に対応することを前提としていBufferedImage.TYPE_INT_*タイプのすべての場合に該当します)。

関連する問題