108

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

目前我正在使用这个:

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.Copy 和 memcpy 但我无法了解他们。

那么有没有其他方法可以实现这个目标呢?

4

7 回答 7

53

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();
    }
}
于 2014-05-19T07:05:17.323 回答
39

那么有没有其他方法可以实现这个目标呢?

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

如果您担心压缩伪影,请选择无损格式。如果您担心 CPU 资源,请选择一种无需压缩的格式 - 例如,只需原始 ARGB 像素。但这当然会导致更大的字节数组。

请注意,如果您选择了包含压缩的格式,那么之后再压缩字节数组是没有意义的——几乎可以肯定它没有任何有益效果。

于 2013-06-27T19:57:09.943 回答
16
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;
    }
于 2014-05-02T08:33:52.093 回答
14

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

ImageConverter converter = new ImageConverter();
byte[] imgArray = (byte[])converter.ConvertTo(imageIn, typeof(byte[]));
于 2013-06-27T20:02:01.803 回答
6
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;
    }
}
于 2017-03-30T08:10:58.213 回答
3

我能找到的最快方法是:

var myArray = (byte[]) new ImageConverter().ConvertTo(InputImg, typeof(byte[]));

希望有用

于 2016-08-14T05:23:50.533 回答
0

尝试以下代码:

public Byte[] ConvertPictureToByte(System.Drawing.Image PictureFile)
{
   using (var MemStrm = new MemoryStream())
   {
      PictureFile.Save(MemStrm,PictureFile.RawFormat);
      return  MemStrm.ToArray();
   }
}
于 2022-02-27T06:42:35.450 回答