如何字节数组转换成在Java SE图片(How to convert array of bytes

2019-06-26 04:46发布

什么是原始字节数组转换为图像在Java SE的正确途径。 阵列由字节,其中每一个的三个字节表示一个像素,具有用于相应的RGB分量的每个字节。

任何人都可以提出一个代码示例?

谢谢,迈克

Answer 1:

假设你知道图像的高度和宽度。

BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for(int r=0; r<height; r++)
for(int c=0; c<width; c++)
{
  int index=r*width+c;
  int red=colors[index] & 0xFF;
  int green=colors[index+1] & 0xFF;
  int blue=colors[index+2] & 0xFF;
  int rgb = (red << 16) | (green << 8) | blue;
  img.setRGB(c, r, rgb);
}

大致。 这假定数据被编码为一组行的像素; 和颜色的长度为3×宽×高(这应该是有效的)。



Answer 2:

您可以使用Raster类做到这一点。 这是更好,因为它不需要字节数组的迭代和复制。

 byte[] raw = new byte[width*height*3]; // raw bytes of our image
 DataBuffer buffer = new DataBufferByte(raw, raw.length);

 //The most difficult part of awt api for me to learn
 SampleModel sampleModel = new ComponentSampleModel(DataBuffer.TYPE_BYTE, width, height, 3, width*3, new int[]{2,1,0});

 Raster raster = Raster.createRaster(sampleModel, buffer, null);

 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
 image.setData(raster);


Answer 3:

folkyatina的方式工作,如果你的RGB值是B,G,R的顺序,但如果他们在R,G,B为了我发现下面的代码工作:

    DataBuffer rgbData = new DataBufferByte(rgbs, rgbs.length);

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

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

    return new BufferedImage(colorModel, raster, false, null);


Answer 4:

有它接受RGBA值的int数组setRGB变体:

BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
int[] raw = new int[data.length * 4 / 3];
for (int i = 0; i < data.length / 3; i++) {
    raw[i] = 0xFF000000 | 
        ((data[3 * i + 0] & 0xFF) << 16) |
        ((data[3 * i + 1] & 0xFF) << 8) |
        ((data[3 * i + 2] & 0xFF));
}
img.setRGB(0, 0, width, height, raw, 0, width);

性能特点类似于CoderTao的解决方案。



文章来源: How to convert array of bytes into Image in Java SE