Самый быстрый способ преобразования изображения в байтовый массив
Я делаю приложение для совместного использования удаленного рабочего стола, в котором я беру изображение рабочего стола и сжимаю его и отправляю его получателю. Чтобы сжать изображение, мне нужно преобразовать его в байт [].
В настоящее время я использую это:
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, а также использовать ресурсы (Slow Down), а также создавать разные результаты сжатия. Я прочитал об использовании Marshal.Copy и memcpy, но я я не могу понять их.
Итак, есть ли другой способ достижения этой цели?
Ответы
Ответ 1
Итак, есть ли другой способ достижения этой цели?
Нет. Чтобы преобразовать изображение в байтовый массив, вы должны указать формат изображения - так же, как вам нужно указать кодировку при преобразовании текста в массив байтов.
Если вы беспокоитесь об артефактах сжатия, выберите формат без потерь. Если вы беспокоитесь о ресурсах ЦП, выберите формат, который не требует сжатия - например, только необработанные пиксели ARGB. Но, конечно, это приведет к большему массиву байтов.
Обратите внимание, что если вы выбираете формат, который включает сжатие, тогда нет смысла в этом случае сжимать массив байтов - он почти наверняка не имеет никакого благоприятного эффекта.
Ответ 2
Существует свойство RawFormat параметра Image, которое возвращает формат файла изображения.
Вы можете попробовать следующее:
// extension method
public static byte[] imageToByteArray(this System.Drawing.Image image)
{
using(var ms = new MemoryStream())
{
image.Save(ms, image.RawFormat);
return ms.ToArray();
}
}
Ответ 3
Я не уверен, что вы получите огромную прибыль по причинам, которые указал Джон Скит. Однако вы можете попробовать и сравнить метод TypeConvert.ConvertTo и посмотреть, как он сравнивается с использованием вашего текущего метода.
ImageConverter converter = new ImageConverter();
byte[] imgArray = (byte[])converter.ConvertTo(imageIn, typeof(byte[]));
Ответ 4
public static byte[] ReadImageFile(string imageLocation)
{
byte[] imageData = null;
FileInfo fileInfo = new FileInfo(imageLocation);
long imageFileLength = fileInfo.Length;
FileStream fs = new FileStream(imageLocation, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
imageData = br.ReadBytes((int)imageFileLength);
return imageData;
}
Ответ 5
public static class HelperExtensions
{
//Convert Image to byte[] array:
public static byte[] ToByteArray(this Image imageIn)
{
var ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return ms.ToArray();
}
//Convert byte[] array to Image:
public static Image ToImage(this byte[] byteArrayIn)
{
var ms = new MemoryStream(byteArrayIn);
var returnImage = Image.FromStream(ms);
return returnImage;
}
}
Ответ 6
Самый быстрый способ узнать это:
var myArray = (byte[]) new ImageConverter().ConvertTo(InputImg, typeof(byte[]));
Надеюсь быть полезным