最快的方法将图像转换为字节数组
我正在制作远程桌面共享应用程序,在该应用程序中,我捕获桌面的图像并将其压缩并发送到接收器。 要压缩图像我需要将其转换为一个字节[]。
目前我正在使用这个:
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,并可能会耗尽资源(减慢),以及产生不同的压缩results.I阅读使用Marshal.Copy和memcpy,但我无法了解他们。
那么有没有其他方法可以达到这个目标呢?
那么有没有其他方法可以实现这个目标呢?
不。要将图像转换为字节数组,您必须指定图像格式 – 就像在将文本转换为字节数组时一样,必须指定编码。
如果您担心压缩文物,请select无损格式。 如果您担心CPU资源,请select一种不会打扰压缩的格式,例如,只是原始的ARGB像素。 但是,这当然会导致更大的字节数组。
请注意,如果您select包含压缩的格式, 则之后压缩字节数组毫无意义 – 几乎肯定没有任何有益效果。
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(); } }
Jon Skeet指出,我不确定你是否会获得巨大收益。 然而,你可以尝试和基准TypeConvert.ConvertTo方法,看看它是如何比较使用你当前的方法。
ImageConverter converter = new ImageConverter(); byte[] imgArray = (byte[])converter.ConvertTo(imageIn, typeof(byte[]));
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; }
我能find的最快的方法是:
var myArray = (byte[]) new ImageConverter().ConvertTo(InputImg, 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; } }