Самый быстрый способ преобразования изображения в массив байтов

Я делаю приложение удаленного рабочего стола, в котором я захватываю изображение рабочего стола и сжимаю его и отправляю его получателю. Чтобы сжать изображение, мне нужно преобразовать его в байт[].

В настоящее время я использую это:

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[]));

надеюсь быть полезным