Сжать и отправить изображение по сети в Java? - PullRequest
1 голос
/ 25 апреля 2009

У меня есть сервер, который ожидает подключения от клиента, а затем отправляет изображение этому клиенту с помощью класса Socket.

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

Изображения имеют размер 1000 на 1000 пикселей BufferedImages, и мой текущий способ их отправки - перебрать все пиксели и отправить это значение, а затем восстановить его на другой стороне. Я подозреваю, что это не лучший способ сделать что-либо.

Кто-нибудь может дать какой-нибудь совет по сжатию и лучшему способу отправки изображений по сети?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 25 апреля 2009

Сжатие очень важно для курсов: какой метод на самом деле будет работать лучше, зависит от того, откуда изначально было получено ваше изображение и каковы ваши требования (главным образом, разрешаете ли вы сжатие с потерями и, если да, то какие ограничения вы место на нем).

Для начала, попробуйте использовать ImageIO.write () для записи изображения в формате JPEG или PNG в ByteArrayOutputStream , чей результирующий байтовый массив вы затем можете отправить в сокет [1]. Если это даст вам приемлемый результат, то преимущество в том, что оно потребует времени разработки, равного нулю.

Если они не дают приемлемого результата (либо из-за того, что вы не можете использовать сжатие с потерями, либо из-за того, что сжатие PNG не дает приемлемой степени сжатия), возможно, вам придется придумать что-то нестандартное для ваших данных. ; в таком случае. Только вы знаете свои данные в конце дня, но общая техника состоит в том, чтобы попытаться привести ваши данные в форму, где они хорошо работают с Deflater или каким-либо другим стандартным алгоритмом. Так, например, с помощью дефлятора вы преобразуете / переупорядочиваете свои данные так, что повторяющиеся шаблоны и последовательности похожих байтов могут возникать рядом друг с другом. Это может означать отправку всех верхних битов пикселей, затем всех верхних битов и т. Д., А на самом деле не отправлять младшие биты каждого компонента, если они фактически являются просто шумом.

Надеемся, что опция JPEG / PNG даст вам нужный вам результат, и вам не придется больше волноваться.

[1] Извините, следовало бы сказать - вы, очевидно, можете сделать поток вывода сокета тем, в который записываются данные изображения, если вам не нужно сначала запрашивать его длину, возьмите хеш-код ...

3 голосов
/ 25 апреля 2009

JPEG с потерями, поэтому, если вам нужно точно такое же изображение с другой стороны, вы можете использовать GZIPOutputStream поверх OutputStream сокета для отправки сжатых данных и получать их с другой стороны через GZIPInputStream поверх InputStream сокета.

0 голосов
/ 25 апреля 2009

Если вы используете методы getInputStream и getOutputStream в Socket, попробуйте обернуть потоки java.util.net.GZIPInputStream и java.util.net.GZIPOutputStream.

0 голосов
/ 25 апреля 2009

Прошло много времени с тех пор, как я выполнял какую-либо обработку изображений в Java, но вы можете сохранить изображение на сервере в формате JPEG, а затем отправить им URI и позволить им самим получить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...