Самый быстрый способ преобразования изображения в массив байтов
Я делаю приложение удаленного рабочего стола, в котором я захватываю изображение рабочего стола и сжимаю его и отправляю его получателю. Чтобы сжать изображение, мне нужно преобразовать его в байт[].
В настоящее время я использую это:
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.Скопируйте и memcpy, но я не могу понимать их.
Итак, есть ли другой метод для достижения этой цели?
6 ответов
Итак, есть ли другой метод для достижения этой цели?
нет. Чтобы преобразовать изображение в массив байтов, вы есть чтобы указать формат изображения-так же, как вы должны указать кодировку при преобразовании текста в массив байтов.
Если вас беспокоят артефакты сжатия, выберите формат без потерь. Если вы беспокоитесь о ресурсах ЦП, выберите формат, который не беспокоит сжатие - например, только необработанные пиксели ARGB. Но конечно, это приведет к большему массиву байтов.
обратите внимание, что если вы выбираете формат, который тут включить сжатие, нет смысла затем сжимать массив байтов - это почти наверняка не окажет благотворного эффекта.
существует свойство 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();
}
}
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;
}
Я не уверен, что вы собираетесь получить какие-либо огромные выгоды по причинам, указанным Джоном скитом. Тем не менее, вы можете попробовать и проверить TypeConvert.Командлет ConvertTo метод и посмотреть, как он сравнивает с использованием текущего метода.
ImageConverter converter = new ImageConverter();
byte[] imgArray = (byte[])converter.ConvertTo(imageIn, typeof(byte[]));
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;
}
}
самый быстрый способ узнать это:
var myArray = (byte[]) new ImageConverter().ConvertTo(InputImg, typeof(byte[]));
надеюсь быть полезным