使用C#,有没有更好的方式来在Windows转换Bitmap
到一个byte[]
比保存到临时文件和读取使用的结果FileStream
?
pre*_*sto 387
有几种方法.
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
Run Code Online (Sandbox Code Playgroud)
这个很方便,因为它不需要很多代码.
记忆流
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
这个等同于你正在做的,除了文件保存到内存而不是磁盘.虽然更多的代码可以选择ImageFormat,但可以在保存到内存或磁盘之间轻松修改.
资料来源:http://www.vcskicks.com/image-to-byte.php
Chr*_*ens 88
一个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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可以像以下一样使用它:
var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);
Run Code Online (Sandbox Code Playgroud)
我部分不同意prestomanifto关于ImageConverter的回答. 不要使用ImageConverter. 它没有任何技术上的错误,但仅仅是它使用来自对象的装箱/拆箱这一事实告诉我它是来自.NET框架的旧暗处的代码,并且它不适合用于图像处理(转换为字节的过度杀伤) []至少),特别是考虑以下情况时.
我看了一下ImageConverter
.Net框架使用的代码,在内部它使用的代码几乎与我上面提供的代码相同.它创建一个新的MemoryStream
,Bitmap
以您提供它时所处的格式保存,并返回该数组.ImageConverter
通过使用来省略创建类的额外开销MemoryStream
dee*_*gee 42
你也可以只是Marshal.复制位图数据.没有中间存储器流等和快速存储器副本.这应该适用于24位和32位位图.
public static byte[] BitmapToByteArray(Bitmap bitmap)
{
BitmapData bmpdata = null;
try
{
bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
int numbytes = bmpdata.Stride * bitmap.Height;
byte[] bytedata = new byte[numbytes];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, bytedata, 0, numbytes);
return bytedata;
}
finally
{
if (bmpdata != null)
bitmap.UnlockBits(bmpdata);
}
}
Run Code Online (Sandbox Code Playgroud)
.
Chr*_*ter 15
将图像保存到MemoryStream,然后获取字节数组.
http://msdn.microsoft.com/en-us/library/ms142148.aspx
Byte[] data;
using (var memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Bmp);
data = memoryStream.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
小智 10
更简单:
return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[]))
Run Code Online (Sandbox Code Playgroud)
使用a MemoryStream
而不是a FileStream
,像这样:
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
Run Code Online (Sandbox Code Playgroud)
请尝试以下方法:
MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] byteArray = stream.GetBuffer();
Run Code Online (Sandbox Code Playgroud)
确保您使用:
System.Drawing & using System.Drawing.Imaging;
Run Code Online (Sandbox Code Playgroud)
我相信你可能只是这样做:
ImageConverter converter = new ImageConverter();
var bytes = (byte[])converter.ConvertTo(img, typeof(byte[]));
Run Code Online (Sandbox Code Playgroud)
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
344730 次 |
最近记录: |