什么是原始字节数组转换为图像在Java SE的正确途径。 阵列由字节,其中每一个的三个字节表示一个像素,具有用于相应的RGB分量的每个字节。
任何人都可以提出一个代码示例?
谢谢,迈克
什么是原始字节数组转换为图像在Java SE的正确途径。 阵列由字节,其中每一个的三个字节表示一个像素,具有用于相应的RGB分量的每个字节。
任何人都可以提出一个代码示例?
谢谢,迈克
假设你知道图像的高度和宽度。
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×宽×高(这应该是有效的)。
您可以使用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);
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);
有它接受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的解决方案。