使用c#,是否有更好的方法将Windows位图转换为字节[],而不是保存到临时文件并使用FileStream读取结果?
当前回答
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
其他回答
使用内存流而不是文件流,就像这样:
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
MemoryStream在这方面很有帮助。你可以把它放在一个扩展方法中:
public static class ImageExtensions
{
public static byte[] ToByteArray(this Image image, ImageFormat format)
{
using(MemoryStream ms = new MemoryStream())
{
image.Save(ms, format);
return ms.ToArray();
}
}
}
你可以这样使用它:
var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);
我部分不同意prestomanifto关于ImageConverter的回答。不要使用ImageConverter。它在技术上并没有什么问题,只是它使用了对对象的装箱/拆箱,这一事实告诉我,它是来自。net框架的旧黑暗之处的代码,与图像处理一起使用并不理想(至少对于转换为字节[]来说有点过度了),特别是当你考虑以下问题时。
我查看了一下. net框架使用的ImageConverter代码,它在内部使用的代码几乎与我上面提供的代码相同。它创建了一个新的MemoryStream,以您提供它时的任何格式保存位图,并返回数组。通过使用MemoryStream跳过创建ImageConverter类的额外开销
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
更简单:
return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[]))
非常简单,只需在一行中使用:
byte[] imgdata = File.ReadAllBytes(@"C:\download.png");
推荐文章
- .NET中的Map和Reduce
- 我如何能使一个组合框不可编辑的。net ?
- .NET反射的成本有多高?
- 实体框架回滚并移除不良迁移
- 将流转换为字符串并返回
- 在c#中检查字符串是否只包含数字的最快方法
- IEquatable和重写Object.Equals()之间的区别是什么?
- 创建一个堆栈大小为默认值50倍的线程有什么危险?
- 转换JSON字符串到JSON对象c#
- 显示两个datetime值之间的小时差值
- 如何设置enum为空
- 选择Enum类型的默认值而无需更改值
- 我如何设置在一个组合框中选择的项目,以匹配我的字符串使用c# ?
- String与StringBuilder
- 如何在ASP中使用ILogger进行单元测试。网络核心