来自 RGB byte[] 数组的 BufferedImage

我有一个包含 RGB 值的 byte[] 数组。我想创建 BufferedImage 而不需要一一设置像素,因为图像可能很大。我找到了以下片段:


        byte[] frame = ...;

        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);

        img.setData(Raster.createRaster(img.getSampleModel(), new DataBufferByte(frame, frame.length), new Point() ) );

这确实工作得很好,但有一个小问题;-)TYPE_3BYTE_BGR期望字节以相反的顺序排列。

所以问题是:

  1. 是否可以以某种方式加载我的数组,而无需实际创建具有预期顺序的新字节数组?

  2. 如果不可能,是否有比 for 循环更好的方法将数据从 RGB 格式复制到 BGR?


子衿沉夜
浏览 74回答 2
2回答

GCT1015

试试这个代码BufferedImage img = create3ByteRGBImage(int width, int height, new int[] {8, 8, 8},                                     new int[] {0, 1, 2});    private BufferedImage create3ByteRGBImage(width, height, int[] nBits, int[] bOffs) {            ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);            ColorModel colorModel =                new ComponentColorModel(cs, nBits,                                        false, false,                                        Transparency.OPAQUE,                                        DataBuffer.TYPE_BYTE);            WritableRaster raster =                Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE,                                               width, height,                                               width*3, 3,                                               bOffs, null);            return new BufferedImage(colorModel, raster, false, null);        }

有只小跳蛙

前面的答案有效,但可以简化以更具可读性:ColorSpace colorSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB);ColorModel model = new ComponentColorModel(    colorSpace,     false,    true,     Transparency.OPAQUE,     DataBuffer.TYPE_BYTE);WritableRaster raster = Raster.createInterleavedRaster(    DataBuffer.TYPE_BYTE,     width,     height,     3,     null);BufferedImage image = new BufferedImage(model, raster, true, null);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java