如何在没有内存泄漏的情况下在java中读取许多图像

时间:2014-11-19 09:24:08

标签: java image memory-leaks

我需要阅读许多图像来一个接一个地处理它们。起初我使用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中读取许多图像而不会耗尽内存?

1 个答案:

答案 0 :(得分:0)

我的解决方案是使用img4Java(ImageMagick命令行的java接口)。
通过这种方式,我将图像处理委托给一个释放JVM的外部进程,以便存储内存。

请参阅http://im4java.sourceforge.net/http://www.imagemagick.org/