OOME:Java堆空间 - 还有其他选择吗?

时间:2013-11-20 18:28:59

标签: java image-processing garbage-collection

我创建了一个Java应用程序,它可以读取输入图像,然后创建一个输出图像(组合颜色),我已经使它读取TIFF文件。输入图像需要是多光谱卫星图像,其通常非常大。我通过读取TIFF文件转换为PNG,将它们保存为本地PNG,然后将保存的PNG作为BufferedImage读取。保存的PNG大约是一半大小(约35MB)。 如果可能的话,我真的不想扩展堆大小,如果我能找到一种重新分配内存的方法会很好,如果我能找到一种方法,那将会非常好。但我想使用大型图像文件意味着它是不可避免的,特别是当我需要使用BufferedImages并且可能需要使用更多时。

使用的代码可以在下面看到,重复3次,因此正在读取,保存3个TIFF文件,然后在PNG时读取。基本上我从来没有读过TIFF文件,但是在任何时候都没有,所以这将是一个回收内存的方法吗?


private void importBlueActionPerformed(java.awt.event.ActionEvent evt) {                                           
    int img3 = blueFileChooser.showOpenDialog(this);
    if(img3==JFileChooser.APPROVE_OPTION)
{
        try {
            File file3 = blueFileChooser.getSelectedFile();
            BufferedImage bi3 = ImageIO.read(file3);
            ImageIO.write(bi3, "PNG", new File("img3_tmp.png"));
            image3 = ImageIO.read(new File("img3_tmp.png"));
            //image3 = new BufferedImage(img3_tmp.getWidth(), img3_tmp.getHeight(), BufferedImage.TYPE_INT_ARGB);
            ImageIcon imageIcon3 = new ImageIcon(image3);
            Image blueInput = imageIcon3.getImage().getScaledInstance(300, 300, Image.SCALE_SMOOTH);
            imageIcon3.setImage(blueInput);
            blueLabel.setIcon(imageIcon3);
            System.out.println(file3+"\n"+image3);
            inputCounter++;
            checkInput();
        } catch (IOException ex) {
            Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
   }
}

0 个答案:

没有答案