来自 4 位数据缓冲区的 BufferedImage
BufferedImage from 4-bit data buffer
你好,我在将我的 4 位数据缓冲区转换为 WritableRaster 时遇到了问题。
图片分辨率:1024x768 (786432)
这是我正在做的描述。
1) 创建 4 位 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) 从DataBuffer中获取byte array from 4-bit
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 位像素数据设置为 WritableRaster 的正确方法吗?
已解决。
我只需要通过给它 SampleModel:
创建 WritableRaster
SampleModel sm = MY_BIT_4_COLOR_MODEL.createCompatibleSampleModel(width, height);
WritableRaster wr = Raster.createWritableRaster(sm, buffer, new Point(0,0));
您几乎可以使用初始代码,唯一的问题是您试图创建一个 "interleaved" 光栅。对于调色板图像 (IndexColorModel
),通常每个像素只有一个样本(调色板索引),因此没有要交错的样本。
相反,您的像素数据是 4 bit/pixel,存储为每字节两个像素。每个存储单元存储更多样本,通常称为 "packed"。这意味着您需要使用 Raster.createPackedRaster
方法之一创建 "packed" 光栅。
这是一个完整的、可运行的示例:
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);
}
你好,我在将我的 4 位数据缓冲区转换为 WritableRaster 时遇到了问题。 图片分辨率:1024x768 (786432)
这是我正在做的描述。
1) 创建 4 位 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) 从DataBuffer中获取byte array from 4-bit
byte[] pixelData = ((DataBufferByte) bit4Image.getRaster().getDataBuffer()).getData();
// pixelData length is 393216
3) 现在我想从这个字节数组 pixelData
创建 BufferedImageBufferedImage 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 位像素数据设置为 WritableRaster 的正确方法吗?
已解决。
我只需要通过给它 SampleModel:
创建 WritableRaster
SampleModel sm = MY_BIT_4_COLOR_MODEL.createCompatibleSampleModel(width, height);
WritableRaster wr = Raster.createWritableRaster(sm, buffer, new Point(0,0));
您几乎可以使用初始代码,唯一的问题是您试图创建一个 "interleaved" 光栅。对于调色板图像 (IndexColorModel
),通常每个像素只有一个样本(调色板索引),因此没有要交错的样本。
相反,您的像素数据是 4 bit/pixel,存储为每字节两个像素。每个存储单元存储更多样本,通常称为 "packed"。这意味着您需要使用 Raster.createPackedRaster
方法之一创建 "packed" 光栅。
这是一个完整的、可运行的示例:
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);
}