加载图片错误

时间:2012-09-08 20:26:53

标签: java image javax.imageio

我需要将生成的图像加载到我的Java桌面应用程序中。

我使用的代码与此相似:

BufferedImage img = null;
try {
    img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
//it isn't the code here
}

它加载的图像,但在更大的图像,我的应用程序只是退出。

如何检测我可以加载多大的图像,或者不仅仅是退出?

3 个答案:

答案 0 :(得分:1)

  

如何检测我可以加载多大的图像,或者不仅仅是退出?

可能有一些库允许您通过读取标题来确定图像的WxH和颜色深度,但J2SE中的任何内容都不会开箱即用。

“从另一个方向”的另一种方法是采取防御性方法来加载它们。 this answer中的代码概述了此技术,但可归纳为:

  • 保留内存缓冲区
  • 提前准备记忆警告面板
  • 执行'内存密集型'任务
  • on OutOfMemoryError:通过清除缓冲区为VM提供一些内存“呼吸空间”
  • 告诉用户出了什么问题,以及如何解决问题

答案 1 :(得分:1)

如果您不在事件调度程序线程中(例如,当按下UI中的按钮时),您的应用程序将不会崩溃。它将崩溃线程,它将被解除分配,你将无法获得图像,但你的应用程序将活着。

有可能创建一个Thread:或者您将扩展一个Thread并覆盖run()方法或创建一个Runnable接口并将其提供给一个线程构造函数。

BufferedImage img = null;
try {
    img = ImageIO.read(new File("strawberry.jpg"));
} catch (IOException e) {
//it isn't the code here
}catch(OutOfMemoryError err){
// your code will be here :)
}

在输入加载图片功能之前尝试调试/记录您的代码,看看你的最大可分配内存是多少:

// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory();

// Get maximum size of heap in bytes. The heap cannot grow beyond this size.
// Any attempt will result in an OutOfMemoryException.
long heapMaxSize = Runtime.getRuntime().maxMemory();

// Get amount of free memory within the heap in bytes. This size will increase
// after garbage collection and decrease as new objects are created.
long heapFreeSize = Runtime.getRuntime().freeMemory();

如果你有50 MB空闲且文件是50MB,那么没有理由尝试加载。

答案 2 :(得分:0)

Java程序可以使用最大量的内存。 我相信最大尺寸大约是128MB。

希望这能帮到你!