powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сжатие изображения на лету
21 сообщений из 21, страница 1 из 1
Сжатие изображения на лету
    #38426332
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Есть необходимость сжимать большие изображения (например фотки), хранящиеся на сервере, перед передачей клиенту по медленному каналу связи.
Подскажите бибы, с помощью которых можно это делать?
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38426356
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А при чем здесь Java? Форматы хранения изображений, обычно, уже используют сжатие. Сжать сильнее без потери качества, зачастую, затруднительно. Пережимать изображения в Java через ImageIO достаточно расточительно, лучше использовати нативные инструменты. Если изображения не пережимать, тогда любым zip-ованием можно попробовтаь сэкономить пару байт.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38426423
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Фотка с фотоаппарата занимает 5-8 метров.
Если ее передавать по мобильному интернету и минуты времени не хватает.

В принципе, может попробовать просто уменьшать ее размер (ширину х высоту)?
Это ведь позволит уменьшить размер файла?
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38426434
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex2808Фотка с фотоаппарата занимает 5-8 метров.
Если ее передавать по мобильному интернету и минуты времени не хватает.

Так мы же не знаем вашей бизнес задачи. Можно всегда передать thumbnail. Но их не так часто генерят на лету. Проще их сгенерировтаь заранее.

alex2808В принципе, может попробовать просто уменьшать ее размер (ширину х высоту)?
Это ведь позволит уменьшить размер файла?
Конечно. Если это jpeg можно и сжатие посильнее задать.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38426534
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У нас была похожая задача - в документе 2-3 десятка фоток, оператору (в регионе) надо сгруппировать их по определенным признакам. Хранилище документов - для программы внешнее, под хранение контрольных отпечатков не заточено. Поэтому решили сжимать на лету. В результате клиент получает сжатые отпечатки, для которых указано максимальное разрешение по ширине/высоте (сейчас 160px), вполне комфортно может их сортировать с помощью DND, если надо, кликает на отпечаток и с помощью ajax смотрит в полном разрешении.
Хинты для преобразования, возможно, подсмотрели здесь, качество устраивает:
Код: 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.
	public static boolean rescale(InputStream input, OutputStream output, int maxDim) throws IOException {
		// Open the source image
		BufferedImage source = ImageIO.read(input);
		if (source==null) {
			return false;
		}
		// Get width & height
		int w = source.getWidth(), h = source.getHeight();
		// Calculate the scale
		double scale = (double)maxDim/Math.max((double)w, (double)h);
		if (scale>=1) {
			//scale=1;
			copyStream(input, output);
			return false;
		}
		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);
			// Get the scaled instance
			Image scaled = source.getScaledInstance((int)(w * scale), (int)(h * scale), Image.SCALE_SMOOTH);
			// Set the color
			graphics.setColor(Color.WHITE);
			// Paint the white rectangle
			graphics.fillRect(0, 0, tw, th);
			// Draw the image
			graphics.drawImage(scaled, 0, 0, null);
		} finally {
			// Always dispose the graphics
			graphics.dispose();
		}
		// Write the rescaled image
		ImageIO.write(image, "jpg", output);
		return true;
	}


Пока для ~ 100 пользователей сервер практически не напрягается, далее, возможно, придется городить кеш для отпечатков. Для клиентов тоже вполне комфортно, отпечатки при таком разрешении имеют размер 3-5 кб
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38427449
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz... Пережимать изображения в Java через ImageIO достаточно расточительно, лучше использовати нативные инструменты. ...
А почему? - Интересно, почему нежелательно.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38427694
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckBlazkowicz... Пережимать изображения в Java через ImageIO достаточно расточительно, лучше использовати нативные инструменты. ...
А почему? - Интересно, почему нежелательно.
"Расточительно" - по памяти. Зависит, конечно? от формата.
Eсли речь про то что исходные файлы в "нежатом" JPEG, то это 20-30 мегапикселей. 80Мб только на то чтобы загнать картинку в битмап. Плюс некоторые расходны на "пережатие" и сам thumbnail. А теперь прикинем если у нас многопользовательский сервер...
Если, нет, то и проблем меньше. Но мы то не знаем что за система у автора.

Мне кажется, что оптимальным вариантом будет запуск асинхронного процесса создания thumbnail ещё на этапе хранения этих крупных изображений. Тогда юзеры смогут получать thumbnail, вообще не нагружая сервер.
А сам асинхронный процесс создания thumbnail проще контролировать через ThreadPool например. Т.е. мы точно будем знать что у нас не более N изображений одновременно обрабатываются в памяти.

И вот тогда уже можно подумать, ImageIO нас устраивает по влиянию на GC и производительности. Или нет. И ковырять различные Opensource API и нативные реализации.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38427696
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошая коллекция
http://stackoverflow.com/a/2407269
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38427773
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно. Спасибо. Просто возникла мысль: какая разница - запускать нативный инструмент или пережимать в коде - затраты памяти по идее не так различаются. А что до миниатюр, то согласен, причем, иногда даже надо делать 2 - действительно миниатюрка и картинка в размере под разрешение экрана - для быстрого показа. Но это от задачи.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38427779
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckЯсно. Спасибо. Просто возникла мысль: какая разница - запускать нативный инструмент или пережимать в коде - затраты памяти по идее не так различаются.
Зависит от того какой эффект это производит на кучу в нашей системе.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38427787
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме этого я подозреваю что должны существовать тулзы, которые могут пережимать изображения более поточно. Т.е. ещё на этапе распаковки из формата в bitmap, можно не хранить целиком оригинальный bitmap, а обновлять непосредственно thumbnail новыми данными. С ImageIO так не выйдет.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38428619
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, кстати интересно как ImageIO внутри реализован. Подвязан-ли он на какие-то
недокументирвоанные sun.* native вызовы или реализует все кодеки сам?
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38428734
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonBlazkowicz, кстати интересно как ImageIO внутри реализован. Подвязан-ли он на какие-то
недокументирвоанные sun.* native вызовы или реализует все кодеки сам?
Именно кодеки для отдельных типов скорее всего pure java. Но они подключаются через SPI, так что нативные в теории там тоже могут быть. Тот же JAI вроде что-то нативное делает.
Кроме этого BufferedImage тоже может быть связан с нативными ресурсами и держать изображение вне хипа в нативной памяти.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38428759
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczКроме этого BufferedImage тоже может быть связан с нативными ресурсами и держать изображение вне хипа в нативной памяти.
Это вообще капец. Неучтённая память получается.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38428776
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто вообще капец. Неучтённая память получается.
ByteBuffer, чо.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38430836
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
imagemagic уже предлагали? с оберткой im4java
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38431069
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex2808Всем привет.
Есть необходимость сжимать большие изображения (например фотки), хранящиеся на сервере, перед передачей клиенту по медленному каналу связи.
Подскажите бибы, с помощью которых можно это делать?
Я-бы предложил два кейса.

1) Подождать пока внедрят Jpeg2000. Там это "из коробки".
2) Сделать thumbnails.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38431079
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще есть третий вариант. Я помню во времена медленных интерентов
было модно использовать прогрессивную развёртку для Gif-картинок
и Jpeg. И это реально работало. Пользователь видел картинку когда
уже когда 5-20% трафика было передано.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38433917
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton1) Подождать пока внедрят Jpeg2000. Там это "из коробки".
1. Сколько ждать?
2. Что там должно выпрыгнуть "из коробки"?

Спеки Jpeg 2000 читал еще в 1998 году, Вы его с тех пор ждете?

Идея tiled image уже в 1998 году было внесена во многие api (интрефейсы) java, вроде в том числе и в java 2d. Надеюсь с тех пор уже успели и имплементировать. Мы же юзали JTIP и SPIF (Jpeg tiled piramedales сорри за мой французский, SPIF европейское расширение JFIF с информационными тегами)

В наше время, если кому нужно, то народ к статическим картинкам прикручивает WMS-T сервера (Web Map Service tile cache) и радуется жизни. См. ряд статей на http://gis-lab.info/ ( http://gis-lab.info/qa/zoomable-image-leaflet.html). Можно и FOI сервер /фьюче оф интерест/ прикрутить.

Нафига ждать второго пришествия Jpeg 2000 на землю - мне не особо понятно.

Правда, боюсь, задача автора не столь масштабна.
mayton...прогрессивную развёртку для .. Jpeg. И это реально работало...
Для JPEG ???? Эээээээээ

Другое дело, что в EXIF можно (и большинство вендоров фотиков и прочей техники складывает) положить thumbail для предпросмотра. Но это отнюдь не progressive GIF, progressive PNG.

Как вариант, автор может, конечно, все изображения хранить в виде jpeg (exif) с thumbail и извлекать его оттуда, но значительно проще просто хранить 2-3 изображения. Иконка, экранного разрешения, исходный файл.

Ну, или если изображения очень большие (сотни-тысячи мегапикселей), то tiled images с предварительным масштабированием (см.выше).
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38433935
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevДля JPEG ???? Эээээээээ

http://ru.wikipedia.org/wiki/JPEG В случае progressive JPEG сжатые данные записываются в выходной поток в виде набора сканов, каждый из которых описывает изображение полностью с всё большей степенью детализации. Это достигается либо путём записи в каждый скан не полного набора коэффициентов ДКП, а лишь какой-то их части: сначала — низкочастотных, в следующих сканах — высокочастотных (метод «spectral selection» то есть спектральных выборок), либо путём последовательного, от скана к скану, уточнения коэффициентов ДКП (метод «successive approximation», то есть последовательных приближений). Такое прогрессивное представление данных оказывается особенно полезным при передаче сжатых изображений с использованием низкоскоростных каналов связи, поскольку позволяет получить представление обо всём изображении уже после передачи незначительной части JPEG-файла.
...
Рейтинг: 0 / 0
Сжатие изображения на лету
    #38433941
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevmayton1) Подождать пока внедрят Jpeg2000. Там это "из коробки".
1. Сколько ждать?
2. Что там должно выпрыгнуть "из коробки"?

Сколько еще ждать - смотрие "Правовые споры", и "поддержка в браузерах" нашего предмета обсуждения.

Из коробки должа выйти технология для которой создание thumbnails является ненужной тратой времени.
Сам по себе файл (а точнее его заголовок) уже является thumbnails по отношению к самому себе.
Если я как инженер, прочитавший документацию, попробовавший демо-утилиты и убедившийся что
всё обстоит именно так чего-то не понял, или у вас есть другие сведения - то аргументируйте.

И не пишите много вопросительных знаков. У нас не политика. Просто технический спор.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Сжатие изображения на лету
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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