Java-将bufferedimage转换为byte []而不写入磁盘

tie*_*er1 23 java byte bufferedimage

我正在尝试使用java在套接字上发送多个图像,但我需要一种更快的方法将图像转换为字节数组,以便我可以发送它们.我尝试了以下代码,但它向我的C:\驱动器写了大约10,000张图像.有没有办法在不写入磁盘的情况下进行此转换?谢谢!

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

                    //ImageIO.setUseCache(false);
                    ImageIO.write(bi.getImage(), "jpg", outputStream);

                    byte[] imageBytes = outputStream.toByteArray();
Run Code Online (Sandbox Code Playgroud)

sta*_*ker 46

这应该工作:

byte[] imageBytes = ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData();
Run Code Online (Sandbox Code Playgroud)

  • 这将创建图像的副本.如果您只想直接引用字节,请调用bufferedImage.getRaster().getDataBuffer()并相应地进行转换(转换为DataBufferByte并不总是安全的) (17认同)
  • 这对我来说似乎不起作用.我得到`java.awt.image.DataBufferInt无法强制转换为java.awt.image.DataBufferByte`我的bufferedimage来自`Robot.createScreenCapture()`不确定是否重要 (3认同)
  • bufferedImage.getData().getDataBuffer() 正在为缓冲图像创建无效的字节数组 (2认同)

Ede*_*aum 5

下面的代码真的很快(几毫秒)

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public byte[] toByteArray(BufferedImage image) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();            
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos);
    encoder.encode(image);            
    return baos.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)

  • 最好远离 com.sun 包。 (8认同)