Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中利用像素字节数组生成bmp图像_Java_Bufferedimage_Pixels_Raster - Fatal编程技术网

如何在java中利用像素字节数组生成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方法设置可写光栅的像素。但在这里我必须提

我有一个字节数组,包含.bmp文件中的像素值。它是通过以下操作生成的:

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.谢谢你的时间。。