【问题标题】:Out of memory Exception while dealing with images. in java处理图像时出现内存不足异常。在java中
【发布时间】:2012-12-15 11:38:36
【问题描述】:

==================嗨这里是我的代码======================== ======

这是一个例子

imgscalr

package anil1.main;

import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageFilter;
import java.io.File;

import javax.imageio.ImageIO;

import org.imgscalr.Scalr;

import static org.imgscalr.Scalr.*;

public class ImageScalar {
    public static void thum(String img) throws Exception
    {

         String path1 = "."; 

          String files;
          File folder = new File("C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0\\webapps\\Myapp\\images\\candidates");
          File[] listOfFiles = folder.listFiles(); 

          for (int i = 0; i < listOfFiles.length; i++) 
          {

           if (listOfFiles[i].isFile()) 
           {
           files = listOfFiles[i].getName();
               if (files.endsWith(".jpg") || files.endsWith(".png") || files.endsWith(".jpeg")|| files.endsWith(".JPEG") )
               {

            boolean token =false;
        String path=listOfFiles[i].getPath();

        BufferedImage originalImage = ImageIO.read(new File(path));


    //  BufferedImage thumbnail =Scalr.crop(originalImage, 140, 140, 140, 140);

        BufferedImage thumbnail=Scalr.resize(originalImage, Scalr.Method.ULTRA_QUALITY,Scalr.Mode.FIT_EXACT, 180, 250);




        String parent = "C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0\\webapps\\Myapp";
        String child = "\\Thumbs\\images\\candidates";



    String  total=parent+child+path.substring(path.lastIndexOf("\\"));
    String  total1=parent+child;
    System.out.println(total);

    File f=new File(total1);
    File f1=new File(path);
    File f2=new File(total);
    try{
        if(f1.exists()){
        if(f.exists())
        {

            System.out.println("from if");
        ImageIO.write(thumbnail, "jpeg", f2);

        }
        else 
        {
            System.out.println("from else");
            f.mkdirs();
        ImageIO.write(thumbnail, "jpeg", f2);

        }}
        if (new File(total1).exists())
        token=true;

        System.out.println(token);

               }finally{
                   originalImage.flush();  
                   thumbnail.flush();
                f=null;   
                f1=null;
                thumbnail=null;
                originalImage=null;
               }
             }//if
          }//for
    }//main

    }//class




public static void main(String[] args)throws Exception {
    thum("");
}
}

处理一些图像后,我得到以下异常

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.awt.image.DataBufferInt.<init>(Unknown Source)
    at java.awt.image.Raster.createPackedRaster(Unknown Source)
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
    at java.awt.image.BufferedImage.<init>(Unknown Source)
    at org.imgscalr.Scalr.createOptimalImage(Scalr.java:2006)
    at org.imgscalr.Scalr.scaleImage(Scalr.java:2133)
    at org.imgscalr.Scalr.scaleImageIncrementally(Scalr.java:2275)
    at org.imgscalr.Scalr.resize(Scalr.java:1711)
    at anil1.main.ImageScalar.thum(ImageScalar.java:40)
    at anil1.main.ImageScalar.main(ImageScalar.java:114)

我无法找到解决方案,任何人都可以帮助我吗?

【问题讨论】:

  • 想象在加载时扩展为完整的未压缩大小。这意味着图像占用的内存是磁盘空间的 20-60 倍。我会增加你的最大内存大小,直到这不会发生。
  • 但是我把我创造的一切都作废了
  • 这可能还不够。 OOME 的另一个原因是读取损坏的文件。一些库比其他库更好地处理这些问题,因此图像看起来不错,但实际上并非如此。

标签: java imgscalr


【解决方案1】:

代码很难阅读,因为它没有正确缩进,但您似乎在内存中一次处理一张图像,因此如果这导致 OutOfMemoryError,那么您别无选择,只能增加内存你的虚拟机,或者找到一个使用更少内存的库来做同样的事情。

要增加堆内存,请使用-Xmx 标志来启动您的程序。例如,对于 512 MB 的堆,您可以使用

java -Xmx512m my.MainClass

【讨论】:

  • 我在网络应用程序中做了什么
  • 同样的事情。使用上述选项启动您的 Tomcat 或您正在使用的任何容器。
  • 您好 jb 可以工作,但我在线程“main”javax.imageio.IIOException 中遇到异常:不支持的图像类型,但该图像是可读的并且存在解决方案
  • 尝试使用异常的堆栈跟踪自己弄清楚,如果不能,请提出另一个问题,包含导致异常的缩进代码,以及异常的完整堆栈跟踪。
猜你喜欢
  • 1970-01-01
  • 2016-09-02
  • 2011-09-16
  • 2011-04-13
  • 2011-06-18
  • 2015-02-19
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
相关资源
最近更新 更多