将Image转换为Byte数组的最快方法

use*_*551 103 c# memory bytearray bitmap

我正在制作远程桌面共享应用程序,我在其中捕获桌面图像并压缩它并将其发送到接收器.要压缩图像,我需要将其转换为byte [].

目前我正在使用这个:

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;
}
Run Code Online (Sandbox Code Playgroud)

但我不喜欢它,因为我必须将它保存在ImageFormat中,并且还可能耗尽资源(慢速下降)以及产生不同的压缩结果.我已阅读使用Marshal.Copy和memcpy但我无法了解他们.

那么有没有其他方法来实现这一目标?

小智 50

Image参数的RawFormat属性返回图像的文件格式.您可以尝试以下方法:

// extension method
public static byte[] imageToByteArray(this System.Drawing.Image image)
{
    using(var ms = new MemoryStream())
    {
        image.Save(ms, image.RawFormat);
        return ms.ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议处理MemoryStream或将此方法的主体包装在using(){}语句中 (9认同)
  • @FirstStep因为自己后清理:) (3认同)
  • @FirstStep不太好.更准确地说:如果你使用一个已经实现了IDisposable的对象,那么你应该确保在完成它时调用Dispose(),这样它就可以清理它所绑定的任何资源.当对象超出该语句的范围时,using(){}语句只是为您调用它.所以你可以做`myObject.Dispose()`或`using(myObject){}` - 两者都做同样的事情,但using语句基本上创建了一个可以为你清理的范围. (2认同)

Jon*_*eet 39

那么有没有其他方法来实现这一目标?

不能.为了将图像转换为字节数组,您必须指定图像格式 - 就像在将文本转换为字节数组时必须指定编码一样.

如果您担心压缩文物,请选择无损格式.如果您担心CPU资源,请选择一种不打扰压缩的格式 - 例如,原始ARGB像素.但当然这将导致更大的字节数组.

请注意,如果你选择一个格式包括压缩,有一个在事后再压缩字节数组是没有意义的-这是几乎可以肯定有没有益处.

  • 您可以选择`imageIn.RawFormat`而不是'选择无损格式',它会尝试保存原始图像字节而无需进一步重新编码. (12认同)

key*_*rdP 13

我不确定你是否会因为Jon Skeet指出的原因获得任何巨大收益.但是,您可以尝试对TypeConvert.ConvertTo方法进行基准测试,并查看它与使用当前方法的比较.

ImageConverter converter = new ImageConverter();
byte[] imgArray = (byte[])converter.ConvertTo(imageIn, typeof(byte[]));
Run Code Online (Sandbox Code Playgroud)


bha*_*esh 13

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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到stackoverflow.com,您能否添加一些细节,解释为什么上面的代码示例有帮助.这是其他SO用户可能完全不了解它... http://stackoverflow.com/help/how-to-answer (5认同)

Ahm*_*deh 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;
    }
}
Run Code Online (Sandbox Code Playgroud)