如何在 Java 中将图像转换为字节数组?

我想把一个图像转换成字节数组,反之亦然。在这里,用户将输入图像的名称(.jpg) ,程序将 从文件里读出来并将其转换为字节数组。

274200 次浏览

FileInputStream 是您要寻找的: -)

查看 javax.imageio,特别是 ImageReaderImageWriter,它们是读取和写入图像文件的抽象。

BufferedImage.getRGB(int x, int y)允许您获取给定像素上的 RGB 值,这些值可以分块为字节。

注意: 我认为您不希望读取原始字节,因为那样就必须处理所有的压缩/解压缩。

我认为最好的方法是首先将文件读入一个字节数组,然后使用 ImageIO.read ()将该数组转换为一个图像

试试这个代码片段

BufferedImage image = ImageIO.read(new File("filename.jpg"));


// Process image


ImageIO.write(image, "jpg", new File("output.jpg"));

BufferedImage 由两个主要类组成: 光栅色彩模型。栅格本身由两个类组成,DataBufferByte表示图像内容,另一个表示像素颜色。

如果需要 DataBufferByte 中的数据,请使用:

public byte[] extractBytes (String ImageName) throws IOException {
// open image
File imgPath = new File(ImageName);
BufferedImage bufferedImage = ImageIO.read(imgPath);


// get DataBufferBytes from Raster
WritableRaster raster = bufferedImage .getRaster();
DataBufferByte data   = (DataBufferByte) raster.getDataBuffer();


return ( data.getData() );
}

现在您可以通过在 lsb 中隐藏文本来处理这些字节,或者按照您想要的方式来处理它。

File fnew=new File("/tmp/rose.jpg");
BufferedImage originalImage=ImageIO.read(fnew);
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ImageIO.write(originalImage, "jpg", baos );
byte[] imageInByte=baos.toByteArray();

如果您正在使用 JDK7,则可以使用以下代码。

import java.nio.file.Files;
import java.io.File;


File fi = new File("myfile.jpg");
byte[] fileContent = Files.readAllBytes(fi.toPath())

下面是完整的代码版本。我已经测试过了。BufferedImageBase64类主要起作用。还需要正确设置一些参数。

public class SimpleConvertImage {
public static void main(String[] args) throws IOException{
String dirName="C:\\";
ByteArrayOutputStream baos=new ByteArrayOutputStream(1000);
BufferedImage img=ImageIO.read(new File(dirName,"rose.jpg"));
ImageIO.write(img, "jpg", baos);
baos.flush();


String base64String=Base64.encode(baos.toByteArray());
baos.close();


byte[] bytearray = Base64.decode(base64String);


BufferedImage imag=ImageIO.read(new ByteArrayInputStream(bytearray));
ImageIO.write(imag, "jpg", new File(dirName,"snap.jpg"));
}
}

参考链接

使用 RandomAccessFile将是简单和方便的。

RandomAccessFile f = new RandomAccessFile(filepath, "r");
byte[] bytes = new byte[(int) f.length()];
f.read(bytes);
f.close();