2012-04-20 180 views
19

我试图通过使用java的套接字发送多个图像,但我需要更快的方式将图像转换为字节数组,以便我可以发送它们。我尝试了下面的代码,但它向我的C:\驱动器写了大约10,000个图像。有没有办法在不写入磁盘的情况下进行这种转换?谢谢!Java-将bufferedimage转换为byte []而不写入磁盘

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

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

        byte[] imageBytes = outputStream.toByteArray(); 
+0

注意一点额外的时间做使用更高的压缩图像压缩(低质量)JPEG可以节省大量的网络时间。我认为你需要考虑实际发送的字节大小,在纯粹的'BufferedImage'中会更大。顺便说一句 - 这些图像的来源是什么?如果是例如截图,通常PNG可以提供比默认压缩JPEG更小的字节大小。如果它是连续的截图,甚至可能是一个视频流。 – 2012-04-20 13:47:36

+0

来源是我基本上制作成流的连续截图。但是,是的,我需要弄清楚如何压缩图像而不写入磁盘。这是我的终极目标 – tier1 2012-04-20 15:08:11

回答

38

这应该工作:

byte[] imageBytes = ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData(); 
+0

你的生活节省。谢谢! – tier1 2012-04-20 13:37:59

+14

这将创建图像的副本。如果您只是想直接引用字节,请调用bufferedImage.getRaster()。getDataBuffer()并相应地进行转换(对于DataBufferByte转换并不总是安全的) – 2013-02-25 22:49:40

+3

这似乎不适用于我。我得到'java.awt.image.DataBufferInt不能转换为java.awt.image.DataBufferByte'我的bufferedimage来自'Robot.createScreenCapture()'不知道是否 – user3712476 2016-11-15 19:41:09

1

尝试使用:

ImageIO.setUseCache(false); 

写作之前,也许没有什么帮助。

+0

我试过这个,但是,我相信这仍写入磁盘,它只是在操作完成后删除它。 – tier1 2012-04-20 13:34:06

+0

它不应该,至少根据文档:'将此标志设置为false不允许将磁盘用于将来的流,这可能有利于处理小图像时,因为创建和销毁文件的开销被移除。也许你的程序写到其他地方的磁盘? – soulcheck 2012-04-20 13:37:06

+0

是的,我在文档中也看到了。无论哪种方式,这个操作对我所要做的事情来说都很痛苦。不过谢谢。 – tier1 2012-04-20 13:39:13

1
BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes)); 
byte[] bytes = new byte[buf.capacity()]; 
buf.get(bytes, 0, bytes.length); 
0

低于它的真快(几毫秒)代码

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(); 
} 
+3

最好远离com.sun包。 – 2016-11-15 04:12:41

相关问题