2015-11-11 4 views
1

Когда я загружаю изображение 15 Мб в JavaFX, он занимает около 250 МБ ОЗУ!Проблемы с памятью памяти JavaFX

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

И копирование занимает 10 секунд и увеличивает объем использования ОЗУ до 1 ГБ.

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())); 
    } 

Как уменьшить эффективность использования ОЗУ и скопировать изображение?

ответ

3

Это ожидаемое поведение и уже обсуждалось в системе ошибок JavaFX. Чтобы преодолеть это, вам необходимо указать размер изображения, на которое нужно масштабировать изображение, в конструкторе .

В соответствии с одним из комментариев в JavaFX ведущим разработчиком Kevin Rushforth:

PNG изображение кодируется таким образом, что он должен быть декодирован прежде чем он может быть использован или отображаться. Когда вы создаете изображение, он должен создать этот буфер с W * H пикселями. Каждый пиксель занимает 4 байта в памяти. Как указано, конструктор Image по умолчанию принимает ширину и высоту, указанные в файле, как ширину и высоту изображения. Это изображение 5000 * 5000, означающее 25 000 000 пикселей. В 4 байта каждый, который занимает 100 Мбайт в памяти. Единственный способ уменьшить память - это масштабировать изображение на пути, указав меньшую ширину и высоту, на которые масштабируется изображение.

Хотя, он говорит о PNG, создание буфера с W * H не должно сильно отличаться для изображений JPEG.

Для получения дополнительной информации посетите - Huge memory consumption when loading a large Image

+0

Спасибо! Я попытался получить изображение с помощью _java.awt.Image image = new ImageIcon (path) .getImage(); _ и он дал мне то же самое время и результаты памяти. Так есть ли какое-нибудь руководство, как правильно читать изображения в java? –

+1

Вам нужно прочитать изображение и уменьшить его при чтении. Вы можете сделать это, указав требуемый размер в конструкторе ['Image'] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/image/Image.html#Image-java .lang.String-double-double-boolean-boolean-) –

+0

WOW, это действительно сработало! Я не был очень внимателен. Использование памяти и время резко сократилось, а глупое мерцание исчезло, спасибо! –

Смежные вопросы