将字节数组写入bmp java

时间:2015-04-27 01:35:17

标签: java arrays image bytearray

正如标题所示,我试图用Java编写一个bmp文件的字节数组。目前,我的程序成功将数据写入文件位置,但它似乎缺少数据,因此无法打开。在下面列出的两个函数中,目标是:

fromImage采用灰度级bmp图像字节数据,并将每个整数转换为二进制字符串,然后将其存储在LinkedList节点中。 toImage接受LinkedList,将二进制字符串转换回整数,然后将新的字节数组写回另一个文件。

public static LinkedList<String> fromImage(BufferedImage img) {
    LinkedList<String> new_buff = new LinkedList<String>();
    //try{
        //img = ImageIO.read(new File("img/lena.bmp"));
        byte[] byte_buffer = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();

        for(byte b : byte_buffer){
            String buffer;
            buffer = Integer.toBinaryString(b & 255 | 256).substring(1);
            new_buff.addLast(buffer);
            //System.out.println(buffer);
        }
    //}catch(IOException e){}
    System.out.println("Exiting fromImage");
    return new_buff;
}

// Save a binary number as a BMP image
// Image input hardcoded atm
public static BufferedImage toImage(LinkedList<String> bi) {
    BufferedImage img = null;
    int b;
    byte[] bytes = new byte[bi.size()];
    for(int i = 0; i < bi.size(); i++){
        String temp = bi.get(i);
        b = Integer.parseInt(temp);
        bytes[i] = (byte) b;
        //System.out.println(i);
    }
    System.out.println("Exiting For loop");
    try{
        Files.write(Paths.get("img/encrypted.bmp"), bytes);
        //img = ImageIO.read(new File("img/lena.bmp"));
        //ImageIO.write(img, "bmp", new File("img/encrypted.bmp"));
        //img = ImageIO.read(new File("img/encrypted.bmp"));
    }catch(IOException e){}
    System.out.println("Exiting toImage");
    return img;
}

所以最终,我的问题是 - 我丢失的数据在哪里,为什么我会错过它,我该怎么做才能解决它?

2 个答案:

答案 0 :(得分:3)

BMP有file structure

在这里,您正在写一个名为&#34; encrypted.bmp&#34;的文件,因此我认为您的字节是某些内容的加密,因此不代表有效的bmp文件。

您必须遵守BMP文件结构,添加页眉和页脚,以便您的字节为例如。 BMP文件的像素部分。

最简单的方法是将图片写入BufferedImage img,然后使用ImageIO.write(img, "BMP", new File("encrypted.bmp"))

答案 1 :(得分:0)

我只想将Ekleog's answer转换为可用代码:

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.io.File;
import java.io.IOException;
public static boolean arrayToBMP(byte[] pixelData, int width, int height, File outputFile) throws IOException {
    BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    img.setData(Raster.createRaster(img.getSampleModel(), new DataBufferByte(pixelData, pixelData.length), null));
    return javax.imageio.ImageIO.write(img, "bmp", outputFile);
}