gpt4 book ai didi

java - 从 .cbz 存档中读取图像

转载 作者:行者123 更新时间:2023-11-29 06:02:23 27 4
gpt4 key购买 nike

我想读取 .CBZ 存档中的图像并将它们存储在 ArrayList 中。我尝试了以下解决方案,但至少有 2 个问题。

  1. 我在将 10-15 个图像添加到 ArrayList 后出现内存不足错误
  2. 必须有更好的方法来获取 ArrayList 中的图像,而不是将它们写入临时文件并再次读取。

public class CBZHandler {
final int BUFFER = 2048;
ArrayList<BufferedImage> images = new ArrayList<BufferedImage>();

public void extractCBZ(ZipInputStream tis) throws IOException{
ZipEntry entry;
BufferedOutputStream dest = null;
if(!images.isEmpty())
images.clear();
while((entry = tis.getNextEntry()) != null){
System.out.println("Extracting " + entry.getName());
int count;
FileOutputStream fos = new FileOutputStream("temp");
dest = new BufferedOutputStream(fos,BUFFER);
byte data[] = new byte[BUFFER];
while ((count = tis.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
BufferedImage img = ImageIO.read(new FileInputStream("temp"));
images.add(img);
}
tis.close();
}
}

最佳答案

“OutOfMemoryError”可能或可能不是您尝试存储在内存中的数据量所固有的。您可能需要更改最大堆大小。但是,您当然可以避免写入磁盘 - 只需写入 ByteArrayOutputStream 即可,然后您可以将数据作为字节数组获取 - 可能会创建一个 ByteArrayInputStream 如果你需要。您是否确实需要将它们作为 BufferedImage 添加到您的列表中,而不是(比如说)将每个保留为 byte[]

请注意,如果您能够使用 Guava它使“从 InputStream 中提取数据”变得非常容易:

byte[] data = ByteStreams.toByteArray(tis);

关于java - 从 .cbz 存档中读取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9649036/

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