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

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

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

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

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