Как я могу получить более компактную сериализацию изображения? - PullRequest
1 голос
/ 16 сентября 2008

Я сериализирую изображение JPEG в c # .net. Я просто конвертирую его в байтовый поток и отправляю через веб-сервис. Я заметил, что сериализованный поток байтов в 30 раз больше, чем размер реального изображения. Может кто-нибудь предложить мне лучший подход к сериализации и остаться по отношению к размеру реального изображения?

Ответы [ 7 ]

2 голосов
/ 16 сентября 2008
  1. Вам необходимо прочитать исходный поток изображений с помощью FileStream, а затем передать его на сериализатор с помощью MemoryStream.
  2. Если вы можете использовать только класс Image, попробуйте указать формат вывода массива байтов, который вы получаете.
2 голосов
/ 16 сентября 2008

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

1 голос
/ 16 сентября 2008

Рассмотрите возможность использования потокового WCF . Я не заметил накладных расходов на передачу файлов через этот сервис.

MSDN:

Большие данные и потоковая передача

0 голосов
/ 16 сентября 2008

Может быть, просто разместить изображения на веб-сервере и отправить URL-адрес в ответе веб-службы, а не сериализованное изображение. Это также позволит клиенту кэшировать изображение локально, когда это возможно.

0 голосов
/ 16 сентября 2008

Почему бы не преобразовать его в Base64String?

byte[] arr = File.ReadAllBytes(filename);
string str = Convert.ToBase64String(arr);

На другом конце вы можете изменить его обратно на байт [], выполнив:

byte[] arr = Convert.FromBase64String(string);
0 голосов
/ 16 сентября 2008

И если размер изображений, которые вы отправляете через веб-сервисы, может быть большим, возможно, вы можете взглянуть на MTOM. Это стандарт WS- * для оптимизации размера сообщения с помощью двоичных вложений. Теперь он очень интегрирован в стеки, такие как Axis2 или Metro для Java или в .NET:

http://msdn.microsoft.com/en-us/library/aa528822.aspx (вс 3,0) http://msdn.microsoft.com/en-us/library/ms733742.aspx (ВКФ)

0 голосов
/ 16 сентября 2008

Отказ от ответственности: говорящий не информированный человек
Это компромисс между открытостью / стандартами и производительностью. Может быть, вы используете что-то вроде SOAP, которое добавляет много служебных байтов протокола к пакету данных. Если размер является жизненно важным ограничением, попробуйте отправить его в виде чистого двоичного потока ... фактический синтаксис, возможно, кто-то другой может использовать.

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