powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что может пожирать память?
40 сообщений из 40, показаны все 2 страниц
Что может пожирать память?
    #38967193
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что в этом коде не оптимально, что можно сделать для уменьшения потребления памяти?
-Xmx256m спасает для однозадачного использования, но есть опасения что при большем числе пользователей и этого будет мало..
(сервер tomcat, debian)
Код: 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.
public void yyy(String param) {
      try {
            InputStream inp;
            BufferedImage image;
            double height;
            double step;
            double k;
            ImageWriter imgWriter;
            ImageWriteParam imgWriteParams;
            HSSFPictureData pictureData;
            File file;
            int n;
            Row row;
            HSSFPicture picture;
            imgWriteParams = new WebPWriteParam(null);

            System.out.println(r.maxMemory());
            inp = new FileInputStream("C:\\Temp\\Новая папка (2)\\" + param);
            Workbook workbook = WorkbookFactory.create(inp);
            HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0);
            HSSFPatriarch patriarch = sheet.getDrawingPatriarch();

            if (patriarch != null) {
                // Loop through the objects
                for (HSSFShape shape : patriarch.getChildren()) {
                    if (shape instanceof HSSFPicture) {
                        picture = (HSSFPicture) shape;
                        if (picture.getShapeType() == HSSFSimpleShape.OBJECT_TYPE_PICTURE) {
                            // how to get cell, which contains this picture
                            if (picture.getImageDimension() != null) {
                                row = sheet.getRow(picture.getPreferredSize().getRow1());
                                if (row != null) {
                                    System.out.print(row.getRowNum() + "   ");
                                    pictureData = picture.getPictureData();
                                    image = ImageIO.read(new ByteArrayInputStream(pictureData.getData()));
                                    height = image.getRaster().getHeight();
                                    step = Math.ceil(Math.log(height / 60.0) / Math.log(2));
                                    k = (60.0 * Math.pow(2.0, step)) / height;
                                    System.out.println(k);
                                    image = ScaleDescriptor.create(image, (float) k, (float) k, 0f, 0f, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), null).getAsBufferedImage();
                                    n = (int) step;
                                    while (n-- > 0) {
                                        image = ScaleDescriptor.create(image, 0.5f, 0.5f, 0f, 0f, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), null).getAsBufferedImage();
                                    }

                                    imgWriter = ImageIO.getImageWritersByFormatName("webp").next();

                                    imgWriteParams.setCompressionType("Lossy");
                                    imgWriteParams.setCompressionQuality(.5f);
                                    file = new File("C:\\Temp\\Новая папка (2)\\" + (row.getRowNum() + 1) + "_" + picture.getPreferredSize().getCol1() + "_" + picture.getPictureIndex() + "_.webp");
                                    Iterator iter = row.iterator();
                                    while (iter.hasNext()) {
                                        Object next = iter.next();
                                        System.out.println("    " + next.toString());
                                    }
                                    Files.deleteIfExists(file.toPath());
                                    try (ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(file)) {
                                        imgWriter.setOutput(imageOutputStream);
                                        imgWriter.write(null, new IIOImage(image, null, null), imgWriteParams);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Page7.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException | InvalidFormatException ex) {
            Logger.getLogger(Page7.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967194
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ
код для варианта отладки под окнами
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967243
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вр-первых ничего не ответит лучше чем дамп памяти. Во-вторых про закрытие инпутсримов и сопуствующее не слышали да?
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967248
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никвр-первых ничего не ответит лучше чем дамп памяти. Во-вторых про закрытие инпутсримов и сопуствующее не слышали да?
в каком месте не закрыто и что?
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967250
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Blazkowicz
это несколько пересекается с 15821941
только используеися https://bitbucket.org/luciad/webp-imageio
можешь подсказать ?
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967347
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы посмотрел на PlanarImage.dispose()

и зачем ресайз одной картинки делается в цикле?
Код: java
1.
2.
3.
while (n-- > 0) {
	image = ScaleDescriptor.create(image, ...).getAsBufferedImage();
}
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967375
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.я бы посмотрел на PlanarImage.dispose()

и зачем ресайз одной картинки делается в цикле?
Код: java
1.
2.
3.
while (n-- > 0) {
	image = ScaleDescriptor.create(image, ...).getAsBufferedImage();
}


это "хитрое умеьшение размера"
дело в том, что если сразу уменьшить то качество картинки будет ужасным.
поэтому необходимо уменьшать по шагам не более чем 2 раза.
http://m.habrahabr.ru/post/252175/ тут хорошо описано как это сделать.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967382
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторя бы посмотрел на PlanarImage.dispose()
а куда в моём коде это применить?

так?
Код: java
1.
2.
3.
4.
5.
try (ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(file)) {
                                            imgWriter.setOutput(imageOutputStream);
                                            imgWriter.write(null, new IIOImage(image, null, null), imgWriteParams);
                                            imgWriter.dispose();
                                        }

...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967385
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и как из этого
Код: java
1.
 imgWriter.write(null, new IIOImage(image, null, null), imgWriteParams);


получить ещё и byte[]
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967410
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяэто "хитрое умеьшение размера"
дело в том, что если сразу уменьшить то качество картинки будет ужасным.
поэтому необходимо уменьшать по шагам не более чем 2 раза.
http://m.habrahabr.ru/post/252175/ тут хорошо описано как это сделать.
Там же на хабре была более внятная статья об уменьшении изображений. По-моему достаточно первым шагом сделать размытие. Тогда не будет резких перепадов от пропавших пикселей при уменьшении на втором шаге.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967416
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczвадяэто "хитрое умеьшение размера"
дело в том, что если сразу уменьшить то качество картинки будет ужасным.
поэтому необходимо уменьшать по шагам не более чем 2 раза.
http://m.habrahabr.ru/post/252175/ тут хорошо описано как это сделать.
Там же на хабре была более внятная статья об уменьшении изображений. По-моему достаточно первым шагом сделать размытие. Тогда не будет резких перепадов от пропавших пикселей при уменьшении на втором шаге.
размытие не спасает от пропавших пикселей, какая разница размытый оригинал или нет - сам ресайз в несколько раз за раз даёт это.
постепенное уменьшение даже для фотошопа необходимо (если это не прописано у него в коде)
это дествует и для ресайза в браузере и в (как оказалось для java)
я столкнулся с этим когда делаю превьюшки (высотой 60 пикселей) из большого оригинала.
так делает и браузер когда уменьшаешь изображение - сначала картинка становится маленькой, рябой, потом качество улучшается, рябь пропадает.
если кто захочет убедиться - есть тестовое java приложение - могу скинуть.
это увеличивает время преобразования, но нет пройгрыша в качестве.

ЗЫ. вопросы в силе
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967420
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяразмытие не спасает от пропавших пикселей, какая разница размытый оригинал или нет - сам ресайз в несколько раз за раз даёт это.
Такая, что информация размыта по соседним пикселям. Поэтому устранение соседнего пикселя не ведёт к катастрофически заметным дефектам.

вадяпостепенное уменьшение даже для фотошопа необходимо (если это не прописано у него в коде)

https://ru.wikipedia.org/wiki/Argumentum_ad_verecundiam

вадяэто дествует и для ресайза в браузере и в (как оказалось для java)

И жрет кучу ресурсов. Тем про ресайз уже было 100500.
http://rsdn.ru/forum/java/2277129.1

вадяя столкнулся с этим когда делаю превьюшки (высотой 60 пикселей) из большого оригинала.

Blur таки пробовал или нет?

вадяЗЫ. вопросы в силе
Ну, видно что POI не стримит никак. Можно попробовать изображения из POI, для начала, скинуть на диск. И потом его стримить при чтении. Но вообще стоит просто посчитать расходы памяти на хранение запакованного изображения, распакованного 24-битного растра, и результатов каждой итерации. И только потом решать действительно ли реальное потребление памяти сильно превосходит ожидаемое.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967469
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дефект проявляется в том, что появляются белые точки, и это как бы мало зависит от размытия, да и операция размытия тоже занимает и время и память. да и сами фотки уже качества размытые...

по https://ru.wikipedia.org/wiki/Argumentum_ad_verecundiam
мои заявления из практики это уж поверь на слово.

http://rsdn.ru/forum/java/2277129.1 проверю, про ресайз - у меня уже есть давно работающий код, но он изменял размер не в 4-5 раз, и на нём этот дефект не проявлялся. ну и меня интересует формат webp.
этот дефект проявляется очень заметко когда картинка преобразуется c изменением рамера 10+ раз.

работа через диск - это уж на самый полследний случай, потому как обрабатывается из экселя в цикле до 300 картинок.

по потреблению памяти понятно, что работа с картинками затратная по памяти, меня интересовал вопрос с точки зрения правильности кода, его оптимизации.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967502
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадядефект проявляется в том, что появляются белые точки, и это как бы мало зависит от размытия
Откуда они появляются??

вадя, да и операция размытия тоже занимает и время и память. да и сами фотки уже качества размытые...
Размытие можно реализовать на то же растре с минимальными потерями по памяти. Но будет дольше, это да.

вадяпо https://ru.wikipedia.org/wiki/Argumentum_ad_verecundiam
мои заявления из практики это уж поверь на слово.

Ну, просто, если практики много, то должно быть понимание что и от чего, а не "в фотошопе тоже так"

вадя http://rsdn.ru/forum/java/2277129.1 проверю, про ресайз - у меня уже есть давно работающий код, но он изменял размер не в 4-5 раз, и на нём этот дефект не проявлялся. ну и меня интересует формат webp.

Формат не при чем. Это же растр.

вадяэтот дефект проявляется очень заметко когда картинка преобразуется c изменением рамера 10+ раз.

Вот этого я не учел. Давно не ресайзил. Картинки за эти годы подросли.

вадяработа через диск - это уж на самый полследний случай, потому как обрабатывается из экселя в цикле до 300 картинок.

Ну, тогда это не последний случай, а единственный, который поможет сэкономить память. А если планируется многопользовательский сервер, то стоит, наверное масштабирование в очередь загонять и ограничить по ресурсам.

вадяпо потреблению памяти понятно, что работа с картинками затратная по памяти, меня интересовал вопрос с точки зрения правильности кода, его оптимизации.
Ну, код стремный. Многоуровневые условия. Жирнючее тело. Хорошо бы побить на несколько методов.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967538
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНу, просто, если практики много, то должно быть понимание что и от чего, а не "в фотошопе тоже так"
как я уже двал http://m.habrahabr.ru/post/252175/, там немного сказано из-за чего такое может быть, это вроде совпадает с моими наблюдениями и выводами (на абсолютную истину не претендую) по поводу приминительно к фотошопу - ещё лет 10 назад сталкивался с подобнами рекомендациями - но там рекомендовали менять размер не более чем на 5-10% за раз.
авторНу, тогда это не последний случай, а единственный, который поможет сэкономить память. А если планируется многопользовательский сервер, то стоит, наверное масштабирование в очередь загонять и ограничить по ресурсам.

вот тут и хочется узнать что жрет память. как работает такая строка
Код: java
1.
image = ScaleDescriptor.create(image, (float) k, (float) k, 0f, 0f, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), null).getAsBufferedImage();


т.е. получается что требуется двойной объём ?
или правильнее сделать через дополнительный объект
Код: java
1.
image1 = ScaleDescriptor.create(image, (float) k, (float) k, 0f, 0f, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), null).getAsBufferedImage();


с последующим удалением image? через gс?
авторНу, код стремный. Многоуровневые условия. Жирнючее тело. Хорошо бы побить на несколько методов.
по условиям тоже не нравится, но с POI не работал, поэтому взял "как есть" , если есть рекомендации по сокращению - поделись.
как может помочь деление тела на методы? там вроде не так и жирно.
покажи что там можно изменить.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967551
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя, у тебя и чтение, и масштабирование и запись, всё в одном методе. А это минимум 3 разных операции.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967561
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там чтение экселевского файла
далее перебор картинок из него - есть смысл выносить чтение в отдельный метод? и возвращать этот набор, если помимо этого надо обработать и данные по ячейкам?
вынести в отдельный метод масштабирование? что это принципиально изменит? наглядность кода - вопрос спорный, экономию памяти?
ну а выносить в метод 5 строчек записи ? для увелечения числа строк программы?
я просто не вижу большого смысла в этом. возможно я ошибаюсь - поправь.
унификации и многократное использования этого кода в других местах проекта на планируется.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967685
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадякак я уже двал http://m.habrahabr.ru/post/252175/, там немного сказано из-за чего такое может быть,
Код: java
1.
image = ScaleDescriptor.create(image, (float) k, (float) k, 0f, 0f, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), null).getAsBufferedImage();



Если внимательно почитать, что написано в указанной вами статье про то, что масштабирование на canvas сделано простейшим методом, а писать другие на javascript влом, и посмотрев на константы класса Interpolation, то можно задать вопрос - здесь то что мешает?
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967773
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе непонятно, зачем пользоваться ScaleDescriptor'ом из 2006 года, плюс многократное сжатие, когда нужно просто подобрать хинты для преобразования. Может, этот ScaleDescriptor и пожирает.
Вот мне где-то попался набор, вполне удовлетворительно работает
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
	BufferedImage source = ...;
	int w = source.getWidth(), h = source.getHeight();
	int tw = (int)((double)w*scale), th = (int)((double)h*scale);
	// Create the image
	BufferedImage image = new BufferedImage(tw, th, BufferedImage.TYPE_INT_RGB);
	// Create the graphics
	Graphics2D graphics = image.createGraphics();
	try {
		// Set rendering hints
		graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
		graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
		// draw scaled
		graphics.drawImage(source, 0, 0, (int)(w * scale), (int)(h * scale), null);
	} finally {
		// Always dispose the graphics
		graphics.dispose();
	}
	// Write the rescaled image
	ImageIO.write(image, "jpg", outStream);
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967793
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,
у меня тоже есть другой код для ресайза, рабочий..
я твой тоже проверю, спасибо.
а ты делал этим кодом ресайз из картинки 1000*1000 в 60*60? есть возможность проверить?
счас смартфоны и большее число пикселей дают

авторЕсли внимательно почитать, что написано в указанной вами статье про то, что масштабирование на canvas сделано простейшим методом, а писать другие на javascript влом, и посмотрев на константы класса Interpolation, то можно задать вопрос - здесь то что мешает?
честно не всё понял из написанного..
если про этоInterpolation.INTERP_BILINEAR - пробывал все варианты.

ещё раз повторю - сложность заключается в изменении размера в БОЛЬШОЕ КОЛИЧЕСТВО РАЗ
в проекте есть и преобразование загружаемых картинок в браузере по методу из той статьи. пусть он будет и простейший, но других мне не удалось найти. все ресайзят через канвас, либо через флэш (ну его только мне не хватало)
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967804
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ принципе непонятно, зачем пользоваться ScaleDescriptor'ом из 2006 года, плюс многократное сжатие,

я воспользовался этим вариантом https://bitbucket.org/luciad/webp-imageio/overview
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967811
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
при сильном изменении масштаба эти параметры важны:
ANTIALIASING - сглаживание "лесенок" у кривых
INTERPOLATION_BICUBIC - всяко лучше билинейной интерполяции (указана в первом сообщении), так как результирующее значение пикселя вычисляется из 9 соседей, а не из 4-х
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967831
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяivanra,
у меня тоже есть другой код для ресайза, рабочий..
я твой тоже проверю, спасибо.
а ты делал этим кодом ресайз из картинки 1000*1000 в 60*60? есть возможность проверить?
счас смартфоны и большее число пикселей дают
У нас уменьшаются фотографии объектов (тоже со смартфонов и мыльниц). Правда, не так сильно - до 160 по бОльшей стороне, на экране монитора это примерно как 2 кадра 35мм пленки, сложенные вместе
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967846
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя, так что? Разобрался что пожирает память? Кто этот загадочный "лангольер"... ?
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967931
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonвадя, так что? Разобрался что пожирает память? Кто этот загадочный "лангольер"... ?
пока нет.
надо проверить код ivanra и Blazkowicz
а для этого надо набраться смелости :)
если есть мысли что можно поправить с наименьшими переделками - проверю.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968001
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
посмотри библиотеку, упомянутую здесь http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/
Там есть ссылки на альтернативы и статьи по теме.

PS
авторвынести в отдельный метод масштабирование? что это принципиально изменит? наглядность кода - вопрос спорный, экономию памяти?

вадя, даже не хочется начинать разглядывать код, не то, что советовать что-то, после таких заходов.
(Нет смысла заботиться об экономии памяти, если качество кода тебя устраивает.)
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968022
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвадя, даже не хочется начинать разглядывать код, не то, что советовать что-то, после таких заходов.
(Нет смысла заботиться об экономии памяти, если качество кода тебя устраивает.)
в самом начале моего знакомства с java - я ознакомился( из разных источников) что однозначно, категорично надо использовать геттеры и сеттеры.
счас же на видео с семинаров и статьях - говорят, что это не обязательно.
потом я читал высказываня , что рефлексия - зло, за которое надо наказывать, счас на тех же саминарах - если это удобно = используйте.
если есть обоснования, чем моё решение плохо - я с удовольствием изучу.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968046
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяmaytonвадя, так что? Разобрался что пожирает память? Кто этот загадочный "лангольер"... ?
пока нет.
надо проверить код ivanra и Blazkowicz
а для этого надо набраться смелости :)
если есть мысли что можно поправить с наименьшими переделками - проверю.
Для меня твой код, особенно в части работы с org.apache.poi - это тёмный ящик.
Я не использовал его. И поэтому говорить о каких-то мемори оверхедах было-бы
опрометчиво. Я также не знаю какого размера картинки ты уменьшаешь. А их размер
скорее всего влияет на потребление памяти. Если у тебя 16-мегапиксельные фотки
то -Xmx256m скорее всего будет маловато. Да и вообще. Куча такого размера
не котируется даже для других более простых приложений.

Что там смеслости набираться? Купи бутылку крепкого пива - и Go!Go!
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968056
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
авторчем моё решение плохо
"твое решение" идеально. Не обращай внимания.

И, хотя, в целом, так не программируют если не с 1953, то с 1970-го года, (даже если используют goto), в твоем случае это не имеет ни малейшего значения.
Т.к. это не программа, а одноразовый скрипт, который ты не планируешь больше нигде использовать.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968072
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
взял этот метод
без изменений
вот результат
файл ivanra .
остальные - моим вариантом, my_0_5 - качество 0.5 , my_1_0 - качество 1
результаты говорят самиза себя
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968074
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поторопился ....
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968092
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код для теста 17684967
по ссылке Blazkowicz - http://rsdn.ru/forum/java/2277129.1 аналогичный код
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968488
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно, при последовательном уменьшении в 2 раза качество лучше (информация не теряется).
Вот еще статья, где есть сравнение качества и скорости ресайза: https://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html
Ну а для алгоритма такие хинты:
- в статье предлагается, если уменьшаем не ровно на степень двойки, сначала произвести уменьшение на дробную часть, а на следующих шагах - в 2 раза. В приведенном алгоритме на первом шаге - увеличение (до 2х раз). Для мегапиксельных картинок получаем расход памяти:
Код: plaintext
1.
1000*1000*3*2*2 = 12 мб (при исходной картинке, занимающей в памяти 1000*1000*3=3мб)
- вместо логарифмирования и возведения в степень двойки для целых чисел можно просто сдвигать (<< >>)

для себя написал такое масштабирование по большей стороне (maxDim - целевое значение):
Код: 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.
	private BufferedImage resize(BufferedImage source, int width, int height, Map<Key, Object> hints) {
		int type = source.getType() == 0? BufferedImage.TYPE_INT_RGB : source.getType();
		BufferedImage resizedImage = new BufferedImage(width, height, type);
		Graphics2D graphics = resizedImage.createGraphics();
		try {		
			//graphics.setComposite(AlphaComposite.Src);
			graphics.setRenderingHints(hints);
			graphics.drawImage(source, 0, 0, width, height, null);
		} finally {
			graphics.dispose();
		}
		return resizedImage;
	}

	// последовательное уменьшение изображения в 2 раза
	private BufferedImage multiStepRescale(BufferedImage image, int maxDim, Map<Key, Object> hints) throws IOException {
		// Get width & height
		int w = image.getWidth(), h = image.getHeight();
		int srcDim = Math.max(w, h), currDim = maxDim;
		// вычисление первого размера для уменьшения 
		for (int test=maxDim; test<srcDim; test = test<<1) {
			if (test<srcDim) currDim = test;
		}
		while (currDim>=maxDim) {
			double scale = (double)currDim/(double)srcDim;
			w = (int)((double)w*scale);
			h = (int)((double)h*scale);
			image = resize(image, w, h, hints);
			srcDim = Math.max(w, h);
			currDim = currDim >> 1;
		}
		return image;
	}
...
		// и вызов всего этого
		Map<Key, Object> hints = new HashMap<Key, Object>();
		hints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
		hints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		BufferedImage scaled = multiStepRescale(source, maxDim, hints);

...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968552
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если-бы картинка была bitmap то можно было-бы реализовать очень рациональный
с точки зрения memory подход. Нам не нужно было-бы прогружать16-мегапиксельный
jpg в BufferedImage а достаточно было-бы анализировать 2х скан-линии (для 2х кратного
уменьшение) или более сканлиний для дробного уменьшения. И хранить в памяти
Код: java
1.
sizeof(int) * width * scanlines


буфер и еще небольшой кусочек для destination buffer который по сути будет одномерным
массивом.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968559
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

Я когда-то занимался масштабирование картинок без потерь, вот можешь посмотреть мой код https://bitbucket.org/makingpages/katto/wiki/Home

Так же недавно делал масштабирование картинок и их кроп на сервере, и как раз озадачился тем как жрать мало памяти, если интересно могу дать в личку код.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968592
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GregTkвадя,

Я когда-то занимался масштабирование картинок без потерь, вот можешь посмотреть мой код https://bitbucket.org/makingpages/katto/wiki/Home

Так же недавно делал масштабирование картинок и их кроп на сервере, и как раз озадачился тем как жрать мало памяти, если интересно могу дать в личку код.
давай, мыло в профиле, интересно поэксперементировать.
есть код для аналогичного на js. (поворот, ресайз, обрезка - для full и preview)
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38968634
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
да нормальный это алгоритм для сильного уменьшения (последовательное уменьшение в 2 раза + билинейная интерполяция, учитывающая значение 4х рядом стоящих пикселей), разве что структурировать его немного . А по памяти я написал выше - в худшем случае на первом шаге расходуется до 4х раз больше, чем для оригинальной картинки, и это из-за невнимательности при переносе алгоритма с js.
Код в той статье на хабре:
Код: javascript
1.
2.
3.
  var steps = Math.ceil(Math.log2(img.width / w));
  var sW = w * Math.pow(2, steps - 1); // step - 1 !!!!!!!
  var sH = h * Math.pow(2, steps - 1);


А вот в предложенном алгоритме:
Код: java
1.
2.
  step = Math.ceil(Math.log(height / 60.0) / Math.log(2));
  k = (60.0 * Math.pow(2.0, step)) / height;  // step !!!!!


а надо step - 1
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38969036
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,
да я знаю про -1, где-то в логике вычисления у меня ошибка при переносе, с этой -1 не хватает шагов для получения нужного размера.
пока результат конечный верный ... позже надо поправить. :)
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38969101
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
там же всё написано, надо просто повторить. Вот как должен выглядеть фрагмент кода с уменьшением картинки после удаления всего лишнего
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
  step = Math.ceil(Math.log(height / 60.0) / Math.log(2));
  n = (int) step;
  k = (60.0 * (1<<(n - 1))) / height; // степень двойки можно и так вычислять
  while (n-- > 0) {
    image = ScaleDescriptor.create(image, (float)k, (float)k, 0f, 0f, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), null)
        .getAsBufferedImage();
    k = 0.5;
  }


сейчас же, для каритнки 1000х1000 получается вот что
1000/60 = 16.666666... > 2 4
это означает, что на первой итерации картинка увеличивается до размера 60*2 5 =1920 (по объему памяти - почти в 4 раза), вот и расход
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38969127
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra.
Спасибо, работает , ты мне сэкономил время на поиске "ошибки"
и несколько сократилось потребление памяти, заметно даже.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Что может пожирать память?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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