Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Java FX загрузка фотографий / 21 сообщений из 21, страница 1 из 1
02.04.2014, 15:17
    #38603131
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Всем доброго дня. Верните меня на путь истинный. Загружаю фотографию с последующим изменением размера и сохранением в БД, но этот процесс отъедает безумно много памяти (фотография объемом 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
02.04.2014, 15:23
    #38603140
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Что такое "отпускать не хочет" и при чем тут JavaFX? У вас куча всяких byte[]/ByteArrayStream, которые жрут дополнительную память.
Кроме этого надо учитывать что 2Мб JPEG в памяти разворачивается в bitmap 20-30Mb. И у вас их два - оригинальный и измененный.
...
Рейтинг: 0 / 0
02.04.2014, 15:24
    #38603141
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Код: java
1.
2.
catch (Exception e) {
            }


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

по поводу пустого catch - согласен, так нельзя, но код не мой, а взят из примера)).
...
Рейтинг: 0 / 0
02.04.2014, 15:30
    #38603159
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
danatrielBlazkowicz, Отпускать не хочет: после выполнения операций с фотографией (т.е. уже массивом байт) этот массив продолжает висеть в памяти, хотя на него ссылок никаких нет. Предполагаю, что GC должен подчистить этот массив, но я не совсем понимаю его работу. Когда он освобождает память и освобождает ли вообще?
Чем смотрите память? System.gc() пробовали вызывать?
...
Рейтинг: 0 / 0
02.04.2014, 15:31
    #38603162
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Blazkowicz, память смотрю VisualVM. Да пробовал вызывать -результата никакого
...
Рейтинг: 0 / 0
02.04.2014, 15:36
    #38603170
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
danatrielBlazkowicz, память смотрю VisualVM. Да пробовал вызывать -результата никакого
И исключений никаких небыло 100%? Потому что у вас всё закрывается без finally. В случае любого исключение много чего может зависнуть в памяти.
Если интересно, сделайте Heap Dump в VisualVM и приаттачте его к форуму. Я посмотрю. Если слишком секретно всё, то ищите по форуму фразу "GC Roots" - я уже несколько раз описывал как дамп кучи анализировать.
...
Рейтинг: 0 / 0
02.04.2014, 15:41
    #38603179
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Blazkowicz, исключений не было. пошагово прошел по каждой строчке. А как heap прикрепить? Он весит более 30 мб:(
...
Рейтинг: 0 / 0
02.04.2014, 15:49
    #38603193
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
danatrielBlazkowicz, исключений не было. пошагово прошел по каждой строчке. А как heap прикрепить? Он весит более 30 мб:(
Ну, выложить куда-нибудь. Сервисов сейчас для этого только ленивый не написал.
...
Рейтинг: 0 / 0
02.04.2014, 15:56
    #38603207
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
...
Рейтинг: 0 / 0
02.04.2014, 16:10
    #38603231
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Там один растр на 17 Мб, который пережил GC только из-за WeakReference. Если вдруг памяти будет не хватать, то он издохнет. Так что ничего криминального. Попробую разобраться зачем там вообще ссылка на него.
...
Рейтинг: 0 / 0
02.04.2014, 16:12
    #38603234
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Blazkowicz, при загрузке фотки объем используемой памяти с 10 мб возрастал до 75 и оставалось так. Удалось добиться, что после работы GC, объем используемой памяти падает до 32 мб. По всей видимости меньше уже никак?
...
Рейтинг: 0 / 0
02.04.2014, 16:21
    #38603245
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
В 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
02.04.2014, 16:22
    #38603248
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
danatrielBlazkowicz, при загрузке фотки объем используемой памяти с 10 мб возрастал до 75 и оставалось так.
Вы понимаете что растр занимает намного больший объем чем JPEG?

danatrielУдалось добиться, что после работы GC, объем используемой памяти падает до 32 мб. По всей видимости меньше уже никак?
Попробуйте в JAI настройки кэша. А без JAI вообще никак не ресайзиться? Или зачем он вам?
...
Рейтинг: 0 / 0
02.04.2014, 16:23
    #38603249
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Blazkowicz, спасибо огромное! Вы, как всегда, великолепны:)
...
Рейтинг: 0 / 0
02.04.2014, 16:29
    #38603260
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Blazkowicz, конечно, я понимаю, что растр занимает намного больше памяти. А как ресайзить без JAI я не нагуглил:(
...
Рейтинг: 0 / 0
02.04.2014, 16:30
    #38603265
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Blazkowicz,еще часок покопаюсь, если ничего путного не получится, то решу проблему запретом на загрузку больших фоток:)
...
Рейтинг: 0 / 0
02.04.2014, 16:39
    #38603274
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
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
02.04.2014, 16:41
    #38603279
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Blazkowicz, спасибо большое!! а с моим проектом бубен стал моим постоянным инструментом)
...
Рейтинг: 0 / 0
02.04.2014, 16:44
    #38603284
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Ну, и в зависимости от того что и как часто надо ресайзить есть варианты
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
02.04.2014, 16:50
    #38603294
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java FX загрузка фотографий
Blazkowicz,предложенный Вами вариант пару сообщений назад полностью устраивает! шустро работает, и память вообще не занимает! Еще раз, огромное Вам спасибо!!!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Java FX загрузка фотографий / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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