如何在java中利用像素字节数组生成bmp图像
我有一个字节数组,包含.bmp文件中的像素值。它是通过以下操作生成的:如何在java中利用像素字节数组生成bmp图像,java,bufferedimage,pixels,raster,Java,Bufferedimage,Pixels,Raster,我有一个字节数组,包含.bmp文件中的像素值。它是通过以下操作生成的: BufferedImage readImage = ImageIO.read(new File(fileName)); byte imageData[] = ((DataBufferByte)readImage.getData().getDataBuffer()).getData(); 现在我需要重新创建.bmp图像。我试图制作一个BuffereImage并通过调用setPixels方法设置可写光栅的像素。但在这里我必须提
BufferedImage readImage = ImageIO.read(new File(fileName));
byte imageData[] = ((DataBufferByte)readImage.getData().getDataBuffer()).getData();
现在我需要重新创建.bmp图像。我试图制作一个BuffereImage并通过调用setPixels
方法设置可写光栅的像素。但在这里我必须提供int[],float[]或double[]数组。也许我需要将字节数组转换成其中一个。但我不知道怎么做。我还尝试了setDataElements
方法。但我也不知道如何使用这种方法
有人能解释一下如何从字节数组创建bmp图像吗
编辑:@Perception
这就是我到目前为止所做的:
private byte[] getPixelArrayToBmpByteArray(byte[] pixelData, int width, int height, int depth) throws Exception{
int[] pixels = byteToInt(pixelData);
BufferedImage image = null;
if(depth == 8) {
image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
}
else if(depth == 24){
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
}
WritableRaster raster = (WritableRaster) image.getData();
raster.setPixels(0, 0, width, height, pixels);
image.setData(raster);
return getBufferedImageToBmpByteArray(image);
}
private byte[] getBufferedImageToBmpByteArray(BufferedImage image) {
byte[] imageData = null;
try {
ByteArrayOutputStream bas = new ByteArrayOutputStream();
ImageIO.write(image, "bmp", bas);
imageData = bas.toByteArray();
bas.close();
} catch (Exception e) {
e.printStackTrace();
}
return imageData;
}
private int[] byteToInt(byte[] data) {
int[] ints = new int[data.length];
for (int i = 0; i < data.length; i++) {
ints[i] = (int) data[i] & 0xff;
}
return ints;
}
private byte[]getPixelArrayToBmpByteArray(byte[]pixelData,int-width,int-height,int-depth)引发异常{
int[]像素=字节点(像素数据);
BuffereImage图像=空;
如果(深度==8){
图像=新的BuffereImage(宽度、高度、BuffereImage.TYPE_BYTE_GRAY);
}
否则如果(深度==24){
图像=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
}
WritableRaster raster=(WritableRaster)image.getData();
设置像素(0,0,宽度,高度,像素);
image.setData(光栅);
返回GetBufferedImageToBMByteArray(图像);
}
专用字节[]GetBuffereImage ToBYT数组(BuffereImage图像){
字节[]imageData=null;
试一试{
ByteArrayOutputStream bas=新建ByteArrayOutputStream();
图像IO.write(图像“bmp”,bas);
imageData=bas.toByteArray();
bas.close();
}捕获(例外e){
e、 printStackTrace();
}
返回图像数据;
}
私有int[]字节点(字节[]数据){
int[]ints=新的int[data.length];
对于(int i=0;i
问题是,这只适用于灰度图像,但对于彩色图像,颜色不正确。我认为这与BytePoint方法有关。。如果有人知道如何改进,或者有了新的更简单的解决方案,我们将感谢您的帮助:) 每个整数需要包含三个字节。根据缓冲图像的格式,这将是0xRRGGBB BytePoint必须消耗三个字节,如下所示:
private int[] byteToInt(byte[] data) {
int[] ints = new int[data.length / 3];
int byteIdx = 0;
for (int pixel = 0; pixel < ints.length) {
int rByte = (int) pixels[byteIdx++] & 0xFF;
int gByte = (int) pixels[byteIdx++] & 0xFF;
int bByte = (int) pixels[byteIdx++] & 0xFF;
int rgb = (rByte << 16) | (gByte << 8) | bByte
ints[pixel] = rgb;
}
}
private int[]bytepoint(字节[]数据){
int[]int=new int[data.length/3];
int byteIdx=0;
用于(整数像素=0;像素<整数长度){
int rByte=(int)像素[byteIdx++]&0xFF;
int gByte=(int)像素[byteIdx++]&0xFF;
int bByte=(int)像素[byteIdx++]&0xFF;
int rgb=(rByte只有一个字节数组是不够的。你还需要构造一个标题(如果你是从原始格式读取,比如在DICOM文件中)。你当前设置图像数据的代码在哪里?你真的需要从光栅读取吗?你试过了吗?@Leigh u给出的链接是关于制作图像的(特定类型的)从另一个不同类型的图像。但问题是我没有图像,我得到了bmp图像的像素部分(以及像素的宽度和高度).谢谢你的努力..每个像素有多少字节?宽度*高度vs像素.长度?@daveb对于彩色图像,深度是24,所以每个像素3字节。我没有清楚地理解你的第二个问题。可能是你在问字节数组长度..长度是宽度*高度*3.谢谢你的时间。。