Answers:
有几种方法。
图像转换器
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
这很方便,因为它不需要很多代码。
内存流
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
除了将文件保存到内存而不是磁盘之外,此操作与您正在执行的操作等效。尽管有更多代码,但您可以选择ImageFormat,并且可以在保存到内存或磁盘之间轻松地对其进行修改。
ImageConverter
方法会将图像另存为Png,从而导致文件很大。
ImageConverter
不是您可能使用的.net标准MemoryStream
一个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);
对于ImageConverter,我部分不同意prestomanifto的回答。 不要使用ImageConverter。 从技术上讲,它没有什么错,但是它使用对象的装箱/拆箱的事实告诉我,它是来自.NET框架旧的暗处的代码,并且不适合与图像处理一起使用(将其转换为字节是过大的杀伤力) []至少),尤其是当您考虑以下内容时。
我看了看 ImageConverter
.Net框架使用的代码,在内部它使用的代码几乎与我上面提供的代码相同。它创建一个new MemoryStream
,Bitmap
以提供时的格式保存,然后返回该数组。ImageConverter
通过使用跳过创建类的额外开销MemoryStream
您也可以只是元帅。复制位图数据。没有中间的内存流等,并且没有快速的内存副本。这应该适用于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);
}
}
。
将图像保存到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();
}
System.Drawing.Image
(请参阅:docs.microsoft.com/en-us/dotnet/api/…)
System.Drawing.Image does not exist
。所以..不,不起作用:(
使用MemoryStream
而不是FileStream
,例如:
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
ToArray
而不是GetBuffer
。
Note that the buffer contains allocated bytes which might be unused. For example, if the string "test" is written into the MemoryStream object, the length of the buffer returned from GetBuffer is 256, not 4, with 252 bytes unused. To obtain only the data in the buffer, use the ToArray method.
所以现在from的字节数组GetBuffer
将返回图像以及未使用的字节,这很可能会导致图像损坏。
请尝试以下操作:
MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] byteArray = stream.GetBuffer();
确保您正在使用:
System.Drawing & using System.Drawing.Imaging;
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");