【问题标题】:JavaFX load image memory problemsJavaFX 加载图像内存问题
【发布时间】:2016-02-12 22:27:01
【问题描述】:

当我在 JavaFX 中加载 15Mb 的图像时,它需要大约 250Mb 的 RAM!

Image imageColored = new Image("file:C:\\Users\\user\\Desktop\\portret.jpg");
ImageViewResizable imageView = new ImageViewResizable(imageColored);

复制它需要 10 秒,并将 RAM 使用量增加到 1Gb。

WritableImage imageBlack;

int width = (int) imageColored.getWidth();
int height = (int) imageColored.getHeight();

//make img black and white;
imageBlack = new WritableImage(width, height);
PixelReader pixelReader = imageColored.getPixelReader();
PixelWriter pixelWriter = imageBlack.getPixelWriter();

for (int x = 0; x < width; x++)
    for (int y = 0; y < height; y++) {
        Color color = pixelReader.getColor(x, y);
        double grey = (color.getBlue() + color.getGreen() + color.getRed()) / 3;
        pixelWriter.setColor(x, y, new Color(grey, grey, grey, color.getOpacity()));
    }

我怎样才能有效地减少内存使用和复制图像?

【问题讨论】:

    标签: java image javafx imageview javafx-2


    【解决方案1】:

    这是预期行为,已在 JavaFX 错误系统中讨论过。为了克服这个问题,您需要在Image() 中提供图像应该缩放到的图像大小 构造函数。

    根据 JavaFX 首席开发人员 Kevin Rushforth 的其中一位 cmets 所述:

    png 图像的编码方式需要对其进行解码,然后才能使用或显示。当您构建图像时,它必须创建具有 W*H 像素的缓冲区。每个像素在内存中占用 4 个字节。正如指定的,默认的 Image 构造函数将文件中指定的宽度和高度作为图像的宽度和高度。这是一张 5000*5000 的图像,意思是 25,000,000 像素。每个 4 个字节,这需要 100 MB 的内存。减少内存的唯一方法是通过指定较小的图像缩放到的宽度和高度来缩放图像。

    虽然他谈到了 PNG,但对于 JPEG 图像,使用 W*H 创建缓冲区肯定不会有太大不同。

    欲了解更多信息,请访问 - Huge memory consumption when loading a large Image

    【讨论】:

    • 谢谢!我尝试使用 java.awt.Image image = new ImageIcon(path).getImage(); 获取图像,它给了我相同的时间和内存结果。那么有没有关于如何在java中正确读取图像的指南?
    • 您需要阅读图像并在阅读时将其缩小。您只需在 Image constructor 中指定请求的大小即可做到这一点
    • 哇,它确实有效!我不是很专心。内存使用量和时间显着减少,愚蠢的闪烁消失了,谢谢!
    猜你喜欢
    • 2013-02-11
    • 2017-01-27
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多