将图像转换为字节数组的最快方法
本文关键字:方法 数组 字节数 图像 转换 字节 | 更新日期: 2023-09-27 18:20:07
我正在制作远程桌面共享应用程序,在该应用程序中,我捕获了桌面的图像并将其压缩并发送到接收器。要压缩图像,我需要将其转换为字节[]。
目前我正在使用这个:
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的文章,但我无法理解它们。
那么,还有其他方法可以实现这一目标吗?
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();
}
}
那么,还有其他方法可以实现这一目标吗?
没有。为了将图像转换为字节数组,必须指定图像格式,就像将文本转换为字节阵列时必须指定编码一样。
如果您担心压缩伪影,请选择无损格式。如果你担心CPU资源,可以选择一种不需要压缩的格式——例如,只需要原始ARGB像素。但这当然会导致一个更大的字节数组。
请注意,如果您选择的格式确实包含压缩,那么之后压缩字节数组是没有意义的——几乎可以肯定,这不会产生任何有益的效果。
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;
}
我不确定你是否会因为Jon Skeet指出的原因而获得任何巨大的收益。但是,您可以尝试对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[]));
希望成为有用的
尝试以下代码:
public Byte[] ConvertPictureToByte(System.Drawing.Image PictureFile)
{
using (var MemStrm = new MemoryStream())
{
PictureFile.Save(MemStrm,PictureFile.RawFormat);
return MemStrm.ToArray();
}
}