Java 将2D像素阵列转换为BuffereImage

Java 将2D像素阵列转换为BuffereImage,java,image,bufferedimage,pixels,Java,Image,Bufferedimage,Pixels,我使用了SO问题的公认答案代码。现在,我想将其转换回BuffereImage(最好不要使用setRGB()。我试过这个: private BufferedImage createImage(int[][] pixelData, BufferedImage outputImage){ final int[] outputImagePixelData = ((DataBufferInt) outputImage.getRaster().getDataBuffer()).getData();

我使用了SO问题的公认答案代码。现在,我想将其转换回BuffereImage(最好不要使用setRGB()。我试过这个:

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;
}

但它不起作用,因为它将1D数组作为参数,而不是2D数组。

不使用
System.arraycopy
,您只需对
-循环使用双
,并在
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;
}
private buffereImage createImage(int[][]像素数据,buffereImage输出图像){
int[]outputImagePixelData=((DataBufferInt)outputImage.getRaster().getDataBuffer()).getData();
int width=outputImage.getWidth();
int height=outputImage.getHeight();
对于(int y=0;y

上面的代码假设一个数组元素对应一个像素元素(这是所有
BuffereImage.TYPE_INT.*
类型的情况)。

如果您的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;
    }
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 ;
    }
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 ;
    }
}