Сжатие очень важно для курсов: какой метод на самом деле будет работать лучше, зависит от того, откуда изначально было получено ваше изображение и каковы ваши требования (главным образом, разрешаете ли вы сжатие с потерями и, если да, то какие ограничения вы место на нем).
Для начала, попробуйте использовать ImageIO.write () для записи изображения в формате JPEG или PNG в ByteArrayOutputStream , чей результирующий байтовый массив вы затем можете отправить в сокет [1]. Если это даст вам приемлемый результат, то преимущество в том, что оно потребует времени разработки, равного нулю.
Если они не дают приемлемого результата (либо из-за того, что вы не можете использовать сжатие с потерями, либо из-за того, что сжатие PNG не дает приемлемой степени сжатия), возможно, вам придется придумать что-то нестандартное для ваших данных. ; в таком случае. Только вы знаете свои данные в конце дня, но общая техника состоит в том, чтобы попытаться привести ваши данные в форму, где они хорошо работают с Deflater или каким-либо другим стандартным алгоритмом. Так, например, с помощью дефлятора вы преобразуете / переупорядочиваете свои данные так, что повторяющиеся шаблоны и последовательности похожих байтов могут возникать рядом друг с другом. Это может означать отправку всех верхних битов пикселей, затем всех верхних битов и т. Д., А на самом деле не отправлять младшие биты каждого компонента, если они фактически являются просто шумом.
Надеемся, что опция JPEG / PNG даст вам нужный вам результат, и вам не придется больше волноваться.
[1] Извините, следовало бы сказать - вы, очевидно, можете сделать поток вывода сокета тем, в который записываются данные изображения, если вам не нужно сначала запрашивать его длину, возьмите хеш-код ...