我需要阅读许多图像来一个接一个地处理它们。起初我使用IO库来读取每个图像:
File outputfile = new File(uri);
BufferedImage imgBuff = ImageIO.read(outputfile);
imgBuff.flush();
imgBuff = null;
outputfile = null;
然而,它占用了大量内存,我的进程崩溃了。在做了一些研究后,我发现使用java IO库读取许多图像存在许多问题。我使用这个简单的程序来验证内存泄漏是由使用此图像http://tinyurl.com/ku3ff7w读取图像引起的:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.junit.Test;
public class MemoryLeakTest {
static File outputfile = null;
static BufferedImage imgBuff = null;
public static void main(String args[]) {
String uri = "/home/user/Pictures/image.jpg";
outputfile = new File(uri);
for (int i = 0; i < 15000; i++) {
outputfile = new File(uri);
try {
imgBuff = ImageIO.read(outputfile);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (imgBuff != null) {
imgBuff.flush();
imgBuff = null;
}
outputfile = null;
}
}
}
}
我也尝试过使用ImageJ库,但是将图像转换为BufferedImage会出现同样的问题:
ImagePlus bb = op.openImage(uri);
imgBuff = bb.getBufferedImage();
bb.killStack();
bb.flush();
bb.close();
我想我可以将图像作为字节数组读取,这样可以解决问题,但解决方案并不理想。有没有人知道是否有任何库或方法可以在Java中读取许多图像而不会耗尽内存?
答案 0 :(得分:0)
我的解决方案是使用img4Java(ImageMagick命令行的java接口)。
通过这种方式,我将图像处理委托给一个释放JVM的外部进程,以便存储内存。
请参阅http://im4java.sourceforge.net/和http://www.imagemagick.org/