Я делаю приложение для совместного использования удаленного рабочего стола, в котором я захватываю изображение рабочего стола, сжимаю его и отправляю получателю. Чтобы сжать изображение, мне нужно преобразовать его в байт [].
В настоящее время я использую это:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
Но мне это не нравится, потому что мне нужно сохранить его в ImageFormat, и это может также использовать ресурсы (замедлить), а также давать разные результаты сжатия. Я читал об использовании Marshal.Copy и memcpy, но не могу понять их.
Так есть ли другой способ достичь этой цели?
MemoryStream
; это полностью управляемый ресурс, если вы не используете его для удаленного взаимодействия. В обоих этих случаях было бы неуместно избавляться от ресурса.Ответы:
Нет. Чтобы преобразовать изображение в массив байтов, вы должны указать формат изображения - точно так же, как вы должны указать кодировку при преобразовании текста в массив байтов.
Если вас беспокоят артефакты сжатия, выберите формат без потерь. Если вас беспокоят ресурсы процессора, выберите формат, который не требует сжатия - например, только необработанные пиксели ARGB. Но, конечно, это приведет к увеличению массива байтов.
Обратите внимание , что если вы выбираете формат , который делает включать сжатие, нет никакого смысла , то сжимая массив байт после - это почти наверняка не иметь положительный эффект.
источник
imageIn.RawFormat
какие попытки сохранить необработанные байты изображения без дальнейшего перекодирования.Существует свойство RawFormat параметра Image, которое возвращает формат файла изображения. Вы можете попробовать следующее:
источник
myObject.Dispose()
илиusing(myObject){}
- оба делают одно и то же, но оператор using в основном создает область видимости, которая очищает вас.Я не уверен, что вы собираетесь получить какую-то огромную выгоду по причинам, указанным Джоном Скитом. Однако вы можете попробовать протестировать метод TypeConvert.ConvertTo и посмотреть, как он сравнивается с использованием вашего текущего метода.
источник
источник
источник
Самый быстрый способ узнать это:
Надеюсь быть полезным
источник
System.Windows.Controls.Image
объекты. Если вы хотите преобразовать один из них в байты и передать его в эту строку какInputImg
, это не сработает. Он ожидаетSystem.Drawing.Image
объект.