powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Java FX загрузка фотографий
21 сообщений из 21, страница 1 из 1
Java FX загрузка фотографий
    #38603131
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня. Верните меня на путь истинный. Загружаю фотографию с последующим изменением размера и сохранением в БД, но этот процесс отъедает безумно много памяти (фотография объемом 2 Мб забирает 50 Мб и отпускать не хочет). Что я делаю не так? Заранее благодарю.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
             

File image_file = f_chooser.showOpenDialog(getScene().getWindow());

                    if (image_file == null) {
                        return;
                    }
                    ImageResizerJAI ir=new ImageResizerJAI();
                    byte[] resize = ir.resize(ImageIO.read(image_file), 300, 300);
                    select_pers.getFoto().setFoto(resize);
                    Image foto_Image = select_pers.getFoto_Image();
                     ph.setImage(foto_Image);



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
public class ImageResizerJAI {

    private byte[] image;

    public ImageResizerJAI() {
        System.setProperty("com.sun.media.jai.disableMediaLib", "true");
    }

    public byte[] resize(String img, int targetWidth, int targetHeight) throws IOException {
        return resize(new File(img), targetWidth, targetHeight);
    }

    public byte[] resize(File f, int targetWidth, int targetHeight) throws IOException {
        return resize(ImageIO.read(f), targetWidth, targetHeight);
    }

    public byte[] resize(BufferedImage img, int targetWidth, int targetHeight) throws IOException {
        //convert BufferedImage to ByteArray
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(img, "jpeg", baos);
        return resize(baos.toByteArray(), targetWidth, targetHeight);
    }

   
    public byte[] resize(byte[] img, int targetWidth, int targetHeight) throws IOException {

        InputStream imageInputStream = new ByteArrayInputStream(img);

        // read in the original image from an input stream
        SeekableStream seekableImageStream = SeekableStream.wrapInputStream(imageInputStream, true);
        RenderedOp originalImage = JAI.create("stream", seekableImageStream);
        ((OpImage) originalImage.getRendering()).setTileCache(null);

        double scale = getImageScale(originalImage.getWidth(), originalImage.getHeight(), targetWidth, targetHeight);

        ParameterBlock paramBlock = new ParameterBlock();
        paramBlock.addSource(originalImage); // The source image
        paramBlock.add(scale); // The xScale
        paramBlock.add(scale); // The yScale
        paramBlock.add(0.0); // The x translation
        paramBlock.add(0.0); // The y translation

        RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);

        RenderedOp resizedImage = JAI.create("SubsampleAverage", paramBlock, qualityHints);

        // lastly, write the newly-resized image to an output stream, in a specific encoding
        ByteArrayOutputStream encoderOutputStream = new ByteArrayOutputStream();
        JAI.create("encode", resizedImage, encoderOutputStream, "JPEG", null);
        // Export to Byte Array
        image = encoderOutputStream.toByteArray();
        encoderOutputStream.close();

        //free resources
        seekableImageStream.close();
        resizedImage.dispose();
        originalImage.dispose();

        return image;
    }

    public void write(String img, String format) throws IOException {
        write(new File(img), format);
    }

    public void write(File f, String format) throws IOException {
        FileOutputStream fos = null;
        if (image != null) {
            new File(f.getParent()).mkdirs();
            try {
                fos = new FileOutputStream(f);
                fos.write(image);
                fos.close();
            } catch (Exception e) {
            } finally {
                if (fos != null) {
                    fos.close();
                }
            }
        }
    }

    private double getImageScale(int sourceWidth, int sourceHeight,
            int targetWidth, int targetHeight) {
        double scalex = (double) targetWidth / sourceWidth;
        double scaley = (double) targetHeight / sourceHeight;
        return Math.max(scalex, scaley);
    }
}
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603140
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое "отпускать не хочет" и при чем тут JavaFX? У вас куча всяких byte[]/ByteArrayStream, которые жрут дополнительную память.
Кроме этого надо учитывать что 2Мб JPEG в памяти разворачивается в bitmap 20-30Mb. И у вас их два - оригинальный и измененный.
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603141
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
catch (Exception e) {
            }


Удачи в отладке неожиданных отказов.
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603153
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, Отпускать не хочет: после выполнения операций с фотографией (т.е. уже массивом байт) этот массив продолжает висеть в памяти, хотя на него ссылок никаких нет. Предполагаю, что GC должен подчистить этот массив, но я не совсем понимаю его работу. Когда он освобождает память и освобождает ли вообще?

по поводу пустого catch - согласен, так нельзя, но код не мой, а взят из примера)).
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603159
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
danatrielBlazkowicz, Отпускать не хочет: после выполнения операций с фотографией (т.е. уже массивом байт) этот массив продолжает висеть в памяти, хотя на него ссылок никаких нет. Предполагаю, что GC должен подчистить этот массив, но я не совсем понимаю его работу. Когда он освобождает память и освобождает ли вообще?
Чем смотрите память? System.gc() пробовали вызывать?
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603162
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, память смотрю VisualVM. Да пробовал вызывать -результата никакого
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603170
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
danatrielBlazkowicz, память смотрю VisualVM. Да пробовал вызывать -результата никакого
И исключений никаких небыло 100%? Потому что у вас всё закрывается без finally. В случае любого исключение много чего может зависнуть в памяти.
Если интересно, сделайте Heap Dump в VisualVM и приаттачте его к форуму. Я посмотрю. Если слишком секретно всё, то ищите по форуму фразу "GC Roots" - я уже несколько раз описывал как дамп кучи анализировать.
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603179
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, исключений не было. пошагово прошел по каждой строчке. А как heap прикрепить? Он весит более 30 мб:(
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603193
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
danatrielBlazkowicz, исключений не было. пошагово прошел по каждой строчке. А как heap прикрепить? Он весит более 30 мб:(
Ну, выложить куда-нибудь. Сервисов сейчас для этого только ленивый не написал.
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603207
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603231
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там один растр на 17 Мб, который пережил GC только из-за WeakReference. Если вдруг памяти будет не хватать, то он издохнет. Так что ничего криминального. Попробую разобраться зачем там вообще ссылка на него.
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603234
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, при загрузке фотки объем используемой памяти с 10 мб возрастал до 75 и оставалось так. Удалось добиться, что после работы GC, объем используемой памяти падает до 32 мб. По всей видимости меньше уже никак?
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603245
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В JAI FAQ есть о потреблении памяти и настройках евойного кеша.
http://www.oracle.com/technetwork/java/jaifaq-138288.html
В JavaDoc можно найти про потребление памяти и особенность GC
http://docs.oracle.com/cd/E17802_01/products/products/java-media/jai/forDevelopers/jai-apidocs/javax/media/jai/PlanarImage.html

Так что, вроде, ничего криминального. Никаких ссылок на GC Roots не обнаружено.
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603248
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
danatrielBlazkowicz, при загрузке фотки объем используемой памяти с 10 мб возрастал до 75 и оставалось так.
Вы понимаете что растр занимает намного больший объем чем JPEG?

danatrielУдалось добиться, что после работы GC, объем используемой памяти падает до 32 мб. По всей видимости меньше уже никак?
Попробуйте в JAI настройки кэша. А без JAI вообще никак не ресайзиться? Или зачем он вам?
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603249
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, спасибо огромное! Вы, как всегда, великолепны:)
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603260
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, конечно, я понимаю, что растр занимает намного больше памяти. А как ресайзить без JAI я не нагуглил:(
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603265
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,еще часок покопаюсь, если ничего путного не получится, то решу проблему запретом на загрузку больших фоток:)
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603274
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
danatrielBlazkowicz, конечно, я понимаю, что растр занимает намного больше памяти. А как ресайзить без JAI я не нагуглил:(
Java2D FAQ
http://www.oracle.com/technetwork/java/index-137037.html#Q_How_do_I_create_a_resized_copy
Но иногда нужно ещё потанцевать с бубном для качества
http://www.rsdn.ru/forum/java/2277129.1
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603279
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, спасибо большое!! а с моим проектом бубен стал моим постоянным инструментом)
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603284
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, и в зависимости от того что и как часто надо ресайзить есть варианты
http://stackoverflow.com/questions/244164/resize-an-image-in-java-any-open-source-library
http://stackoverflow.com/questions/13892725/java-good-and-free-library-to-resize-images
Потому что на родной scale народ жаловался.
...
Рейтинг: 0 / 0
Java FX загрузка фотографий
    #38603294
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,предложенный Вами вариант пару сообщений назад полностью устраивает! шустро работает, и память вообще не занимает! Еще раз, огромное Вам спасибо!!!
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Java FX загрузка фотографий
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]