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

75

我想将图像转换为字节数组并实现相反的操作。在这里,用户将输入图像的名称(.jpg),程序将从文件中读取它并将其转换为字节数组。


7
可能不是重复问题:提问者的意思是将压缩的图像文件转换为光栅格式,而不是如何读取压缩字节。 - Alex I
7
同意,这个问题不是被标记问题的重复(至少不是通过参考接受的答案)。投票重新开放。 - Harald K
3
这不是重复的内容,因为“文件”和“图像”非常不同。 - digit plumber
9个回答

84

如果您使用的是JDK 7,则可以使用以下代码..

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

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

72

BufferedImage由两个主要类组成:Raster和ColorModel。Raster本身由两个类组成,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)中来处理这些字节,或者按你想要的方式进行处理。


如果图像由短数组支持(这对我和一个tif图像是适用的),它将给您一个DataBufferShort,导致强制转换异常。 - Karussell
这些类需要额外的JAR包吗? - praveen
12
抱歉,但这个答案是无意义的。从图像文件获取字节与从任意文件获取字节并没有区别。你根本不需要使用Java 2D API来实现此操作。这种方法很笨拙,只有在你真正想以某种方式操作图像(缩放、裁剪、着色等)时才需要这样做。只需使用 Files#readAllBytes() 或任何其他在任意文件上通常使用的合理方法即可。 - BalusC
5
图像处理的上下文。 - Wajdy Essam
在处理完字节后,您如何将它们转换回图像? - mp3por
显示剩余2条评论

34
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();

7
请尝试以下代码片段。
BufferedImage image = ImageIO.read(new File("filename.jpg"));

// Process image

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

6
这是一个完整的代码版本,用于实现此操作。我已经测试过了。主要是使用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"));
    }
}

参考链接


3

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

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

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


2
使用RandomAccessFile将会非常简单和方便。
RandomAccessFile f = new RandomAccessFile(filepath, "r");
byte[] bytes = new byte[(int) f.length()];
f.read(bytes);
f.close();

1

你要找的是java.io.FileInputStream :-)


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接