【问题标题】:BufferedImage from 4-bit data buffer来自 4 位数据缓冲区的 BufferedImage
【发布时间】:2018-02-27 03:54:54
【问题描述】:

您好,我在将 4 位数据缓冲区转换为 WritableRaster 时遇到问题。 图像分辨率:1024x768 (786432)

这是我在做什么的描述。

1) 创建 4-bit BufferedImage

bit4Image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY, MY_BIT_4_COLOR_MODEL);
Graphics graphics = bit4Image.getGraphics();
graphics.drawImage(originalImage, 0, 0, null);
graphics.dispose();
//4-bit BufferedImage created. 4-bit BufferedImage is properly made cause it can be saved to hdd and looks good

2) 从 4 位的 DataBuffer 中获取字节数组

byte[] pixelData = ((DataBufferByte)  bit4Image.getRaster().getDataBuffer()).getData();
// pixelData length is 393216

3) 现在我想从这个字节数组 pixelData 创建 BufferedImage

BufferedImage dest = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY, MY_BIT_4_COLOR_MODEL);
DataBufferByte buffer = new DataBufferByte(pixelData, pixelData.length);
WritableRaster raster = Raster.createInterleavedRaster(buffer, width, height, width, 1, new int[]{0}, new Point(0, 0));
dest.setData(raster);

问题是我打电话给Raster.createInterleavedRaster。例外: java.awt.image.RasterFormatException: Data array too small (should be > 786431 )

我也试过这样的

BufferedImage dest = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY, MY_BIT_4_COLOR_MODEL);
dest.getRaster().setDataElements(0, 0, width, height, pixelData);

但是这个给了我类似的失败:
java.lang.ArrayIndexOutOfBoundsException: 393216

有人可以给我一个提示或显示将这个 4 位 pixelData 设置为 WritableRaster 的正确方法吗?

【问题讨论】:

标签: java image-processing awt bufferedimage raster


【解决方案1】:

已解决。 我只需要创建 WritableRaster 并为其提供 SampleModel:
SampleModel sm = MY_BIT_4_COLOR_MODEL.createCompatibleSampleModel(width, height); WritableRaster wr = Raster.createWritableRaster(sm, buffer, new Point(0,0));

【讨论】:

    【解决方案2】:

    您几乎可以使用初始代码,唯一的问题是您尝试创建“交错”栅格。对于调色板图像 (IndexColorModel),每个像素通常只有一个样本(调色板索引),因此没有样本可以交错。

    相反,您的像素数据是 4 位/像素,存储为每个字节两个像素。每个存储单元存储更多样本,通常称为“打包”。这意味着您需要使用Raster.createPackedRaster 方法之一创建“打包”栅格。

    这是一个完整的、可运行的示例:

    public static void main(String[] args) {
            int width = 100;
            int height = 100;
    
            // Create initial 4 bit image
            IndexColorModel icm = new IndexColorModel(4, 16, new int[16], 0, false, -1, DataBuffer.TYPE_BYTE);
            BufferedImage bit4Image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY, icm);
    
            // ...you probably do something in between here
    
            // Get the pixel data
            byte[] pixelData = ((DataBufferByte) bit4Image.getRaster().getDataBuffer()).getData();
    
            // ...you probably do something in between here
    
            // Create a data buffer around the array, wrap in raster
            DataBufferByte buffer = new DataBufferByte(pixelData, pixelData.length);
            WritableRaster raster = Raster.createPackedRaster(buffer, width, height, 4, null);
    
            // Finally create a copy of the image, sharing pixel data
            BufferedImage copy = new BufferedImage(icm, raster, icm.isAlphaPremultiplied(), null);
            System.out.println("copy: " + copy);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 2016-02-13
      • 2017-03-15
      • 1970-01-01
      • 2010-09-23
      相关资源
      最近更新 更多