将字节数组写入 bmp java
Writing a byte array to a bmp java
如标题所示,我正在尝试将字节数组写入 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;
}
所以最终,我的问题是 - 我丢失的数据在哪里,为什么我丢失了它,我能做些什么来修复它?
BMP 有一个 file structure.
在这里,您正在写入一个名为 "encrypted.bmp" 的文件,所以我想您的字节是对某些东西的加密,因此不代表有效的 bmp 文件。
您必须遵守 BMP 文件结构,添加页眉和页脚,以便您的字节是例如。 BMP文件的像素部分。
最简单的方法是将图像写入 BufferedImage img
,然后使用 ImageIO.write(img, "BMP", new File("encrypted.bmp"))
。
我只想把变成可用的代码:
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);
}
如标题所示,我正在尝试将字节数组写入 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;
}
所以最终,我的问题是 - 我丢失的数据在哪里,为什么我丢失了它,我能做些什么来修复它?
BMP 有一个 file structure.
在这里,您正在写入一个名为 "encrypted.bmp" 的文件,所以我想您的字节是对某些东西的加密,因此不代表有效的 bmp 文件。
您必须遵守 BMP 文件结构,添加页眉和页脚,以便您的字节是例如。 BMP文件的像素部分。
最简单的方法是将图像写入 BufferedImage img
,然后使用 ImageIO.write(img, "BMP", new File("encrypted.bmp"))
。
我只想把
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);
}