当我在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()));
}
如何有效降低RAM使用率并复制图像?
答案 0 :(得分:3)
这是预期的行为,已经在JavaFX错误系统中进行了讨论。为了解决这个问题,您需要在Image()
中提供图像应缩放到的图像的大小。
构造
根据JavaFX首席开发人员Kevin Rushforth的评论之一:
png图像的编码方式需要在使用或显示之前进行解码。构造Image时,必须使用W * H像素创建该缓冲区。每个像素在内存中占用4个字节。如指定的那样,默认的Image构造函数将文件中指定的宽度和高度作为图像的宽度和高度。这是5000 * 5000图像,意味着25,000,000像素。每个4字节,内存占用100 MB。减少内存的唯一方法是通过指定缩放图像的较小宽度和高度来缩小图像。
虽然,他谈到了PNG,但创建具有W * H的缓冲区对于JPEG图像来说不能有很大不同。
有关详细信息,请访问 - Huge memory consumption when loading a large Image