gpt4 book ai didi

java - 如何将流数据直接加载到 BufferedImage 中

转载 作者:行者123 更新时间:2023-12-01 15:17:28 25 4
gpt4 key购买 nike

我正在使用 this accepted answer 提供的代码在 Java 中通过套接字发送文件列表。我的目标是接收图像列表。我想做的是将这些图像直接读入内存,如 BufferedImages在将它们写入磁盘之前。然而,我的第一次尝试是使用 ImageIO.read(bis) (再次,请参阅随附的问题)失败,因为它试图继续读取第一个图像文件末尾之外的内容。

我当前的想法是将数据从套接字写入新的输出流,然后从传递到 ImageIO.read() 的输入流中读取该流。 。这样,我可以像程序当前正在执行的那样逐字节写入它,但将其发送到 BufferedImage而不是文件。但是我不确定如何将输出流链接到输入流。

任何人都可以建议对上面的代码进行简单的编辑,或者提供另一种方法吗?

最佳答案

为了在将图像写入磁盘之前读取图像,您需要使用 ByteArrayInputStream。 http://docs.oracle.com/javase/6/docs/api/java/io/ByteArrayInputStream.html

基本上,它创建一个从指定字节数组读取的输入流。因此,您将读取图像长度,然后读取其名称,然后读取长度字节数,创建 ByteArrayInputStream,并将其传递给 ImageIO.read

示例片段:

long fileLength = dis.readLong();
String fileName = dis.readUTF();
byte[] bytes = new byte[fileLength];
dis.readFully(bytes);
BufferedImage bimage = ImageIO.read(new ByteArrayInputStream(bytes));

或者使用您引用的其他答案中的代码:

String dirPath = ...;

ServerSocket serverSocket = ...;
Socket socket = serverSocket.accept();

BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
DataInputStream dis = new DataInputStream(bis);

int filesCount = dis.readInt();
File[] files = new File[filesCount];

for(int i = 0; i < filesCount; i++)
{
long fileLength = dis.readLong();
String fileName = dis.readUTF();
byte[] bytes = new byte[fileLength];
dis.readFully(bytes);
BufferedImage bimage = ImageIO.read(new ByteArrayInputStream(bytes));

//do some shit with your bufferedimage or whatever

files[i] = new File(dirPath + "/" + fileName);

FileOutputStream fos = new FileOutputStream(files[i]);
BufferedOutputStream bos = new BufferedOutputStream(fos);

bos.write(bytes, 0, fileLength);

bos.close();
}

dis.close();

关于java - 如何将流数据直接加载到 BufferedImage 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11435106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com