Java: отправка BufferedImage через Socket с низкой разрядностью - PullRequest
1 голос
/ 08 марта 2010

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

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

Спасибо
Мартейн

Ответы [ 2 ]

1 голос
/ 09 марта 2010

Вам необходимо кодировать данные изображения в формате, который имеет правильные характеристики для вашего изображения.Если это 24-битный цвет и много цветов, и вы не хотите терять качество, вы, вероятно, застряли в PNG, но посмотрите на JPEG без потерь 2000.

Если вы можете потерять качество, попробуйте

  1. Lossy JPEG 2000 - намного меньше, чем JPEG для той же потери качества
  2. , уменьшая количество цветов и используя формат с отображением цветов

Еслиизображение содержит только серые или черно-белые данные, убедитесь, что вы кодируете их как таковые (8-битный серый или 1-битный черный и белый).Затем убедитесь, что вы используете кодировщик, настроенный для такого формата (например, TIFF с группой 4 или JBIG2).

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

Если вы хотите придерживаться того, что есть в Java, вам, вероятно, придется использовать TIFF, PNG или JPEG - существуют сторонние кодировщики изображений (дляНапример, моя компания, Atalasoft , делает .NET-версию этих усовершенствованных кодеров - там также есть поставщики Java)

К вашему сведению: уменьшение битовой глубины обычно означает снижение качества (если толькосокращение бессмысленно).Например, если у меня 24-битное цветное изображение, но все цвета серые (где R == G == B), то уменьшение до 8-битного серого не приведет к потере качества.Это также верно, если ваше изображение имеет коллекцию из 256 различных цветов, и вы переключаетесь в формат с цветовым отображением (индексированный или палитровый).Вы уменьшаете количество байтов и не снижаете качество.

1 голос
/ 08 марта 2010

Посмотрите на пакет java.util.zip для всех о сжатии:

http://java.sun.com/developer/technicalArticles/Programming/compression/

Хотя JPEG и PNG уже каким-то образом сжаты, используя класс Inflater, вы можете уменьшить количество байтов при сохранении точно такого же качества вашего изображения. Сжатие уже сжатого формата обычно не имеет значения. Однако, если вы группируете несколько изображений вместе, их раздувание является значительным (поскольку методы инфляции распознают общие данные в данных объекта, которые уменьшают повторение и, таким образом, уменьшают количество байтов).

...