Как преобразовать изображение в строку наиболее эффективным способом? - PullRequest
3 голосов
/ 19 августа 2011

Я хочу преобразовать файл изображения в строку. Следующие работы:

MemoryStream ms = new MemoryStream();

Image1.Save(ms, ImageFormat.Jpeg);

byte[] picture = ms.ToArray();
string formmattedPic = Convert.ToBase64String(picture);

Однако при сохранении этого файла в XmlWriter требуется несколько веков, прежде чем он будет сохранен (20 секунд для файла изображения 26 КБ). Есть ли способ ускорить это действие?

Спасибо

Ракс

1 Ответ

1 голос
/ 20 декабря 2011

Есть три момента, когда вы выполняете большие операции без необходимости:

  1. Получение байтов потока
  2. Преобразование его в Base64
  3. Запись его в XmlWriter.

Вместо.Первый звонок Length и GetBuffer.Это позволяет вам работать с буфером потока напрямую.(Но сначала очистите его).

Затем внедрите base-64 самостоятельно.Это относительно просто, так как вы берете группы по 3 байта, делаете небольшую перестановку, чтобы получить индекс в символ, в который он будет преобразован, и затем выводите этот символ.В самом конце вы добавляете несколько символов = в зависимости от того, сколько байтов было отправлено в последнем блоке (= для одного оставшегося байта, == для двух оставшихся байтов и ни одного, если не было частичных блоков).

Выполните эту запись в буфер символов (символ []).Самый эффективный размер - это вопрос для экспериментов, но я бы начал с 2048 символов.После того, как вы заполнили буфер, вызовите XmlWriter.WriteRaw для него, а затем снова начните писать обратно с индексом 0.

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

...