javafx内存消耗提示调整图像大小

时间:2014-08-20 09:26:07

标签: java image memory-management bufferedimage graphics2d

我有一个简单的javafx应用程序批处理图像(只是调整大小:) :)这是一个简单的javafx表单,其中包含源目录textField,目标目录textField和所需的维度。在这个应用程序启动后,没有任何动作的简单形式消耗了65MB的内存......启动批处理后,内存消耗跳转到250 MB,然后提升和提升。在700张图像之后,我的应用程序消耗了大约1,35GB的内存(图片大约为3500x2600px,并且它的大小调整为1920x1080)。如果我在每张图像后调用gc(),则内存大约为300 - 350 MB。但是你有一些提示javafx应用程序的较小内存要求或350 MB是可以的,因为Java是虚拟机。谢谢你的提示。几年前我在C#中编写了simillar应用程序并且耗费了大约60 MB的内存:)它有如此大的不同:(但我喜欢Java和多平台Appliation。当然,我通过{{1在第二个Thread中打开图像然后转换为ImageIO.read(),然后创建具有较小尺寸的新BufferedImage(),并通过BufferedImage()

将原始BufferedImage()绘制为新的 - 较小的图像
Graphics2D()

最后

BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g.dispose();

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

使用JavaFX Image constructor创建图片并调整图片大小,而不是使用BufferedImageImageIO

内存消耗应改善为:

  1. 发生的格式转换较少,因此不需要存储中间格式。
  2. 使用JavaFX Image构造函数时,JavaFX javadoc指定:

      

    图像可以在加载时调整大小(例如减少图像消耗的内存量)


  3. 其他问题的答案

      

    如何将其保存在磁盘上?

    目前使用JavaFX将图像保存到磁盘(从最初的Java 8版本开始),这是一个未解决的开放式功能请求:RT-18886 Implement Image writers for JavaFX

    在实施RT-18886之前,您需要在保存之前将图像转换为BufferedImage,以便使用ImageIO将图像保存为jpg等格式。您可以使用SwingFXUtils执行此操作。当您首次将图像加载到内存中时,预先调整图像大小仍然很有效,这就是JavaFX Image构造函数的工作方式。

      

    我还必须创建一个新的Buffered Image,然后使用Graphics2D绘制它。

    您可以将图像作为JavaFX图像加载,然后使用JavaFX Canvas,然后GraphicsContext将其绘制在JavaFX snapshot the canvas上,以获取可以转换为BufferedImage的新图像并使用ImageIO保存。好的,也许不是最有效的流程,但它确实允许您(主要)坚持使用单个框架和API,并避免一些潜在的线程问题。

      

    我使用SwingFXUtils.fromFXImage(im,null)但是我对图片有一个奇怪的过滤器

    我不确切地知道“奇怪的过滤器”是什么意思,但也许你看到RT-14647 Incorrect display of JPEG images,这是在过去的JavaFX更新中修复的。尝试针对最新的Java 8 development release运行,看看是否仍然遇到同样的问题。如果没有,您可以使用mcve创建新问题。


    替代

    几乎可以肯定,只使用BufferedImage,ImageIO和awt / swing框架可以有效地保存已调整大小的图像,但是我不熟悉那个API来评论如何做到这一点我不是粉丝混合Swing,AWT和JavaFX,除非你真的需要。