powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что может пожирать память?
15 сообщений из 40, страница 2 из 2
Что может пожирать память?
    #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
15 сообщений из 40, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Что может пожирать память?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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