.CBZアーカイブ内の画像を読み取り、それらをArrayList内に保存したいと考えています。私は以下の解決策を試しましたが、少なくとも2つの問題があります。.cbzアーカイブから画像を読み取る
- 私は、ArrayListの内の画像を得る代わりに、一時ファイルにそれらを書き込み、それを再度読んでのより良い方法があるに違いありませんArrayListの
- に10-15画像を追加した後のOutOfMemoryエラーが発生します。
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();
}
}
ImageIOはInputStreamから読み取ります。なぜImageIO.read()にZipInputStream( 'tis')を渡さないのですか?イメージのサイズ(バイト単位)は何ですか?また、JVMのヒープのサイズは何ですか? –
これらの画像の解像度(幅*高さ、多分*色深度)を知ることは、メモリ使用量の見積もりにも役立ちます。 –