Problem
Is there a better way to convert a Windows Bitmap to a byte[] in C# than writing the output to a temporary file and reading it using a FileStream?
Asked by Jeremy McGee
Solution #1
There are a few options.
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
This one is handy because it doesn’t necessitate a lot of coding.
Memory Stream
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
This one is the same as the last one, except the file is stored to memory rather than to disk. Although there is more code, ImageFormat is an option that can be simply updated to save to memory or disk.
Source: http://www.vcskicks.com/image-to-byte.php
Answered by prestomanifesto
Solution #2
This is when a MemoryStream comes in handy. You might include it in a method extension:
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();
}
}
}
It might simply be written as:
var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);
In regards to the ImageConverter, I partially disagree with prestomanifto’s response. ImageConverter should not be used. There’s nothing technically wrong with it, but the fact that it uses object boxing/unboxing tells me it’s code from the.NET framework’s dark ages, and it’s not ideal for image processing (at the very least, it’s overkill for converting to a byte[]), especially when you consider the following.
I looked at the.Net framework’s ImageConverter function, and it utilizes code that is nearly identical to the one I posted above. It starts a new MemoryStream, saves the Bitmap in the format you provided it with, and returns the array. By using MemoryStream, you may avoid the added overhead of building an ImageConverter class.
Answered by Christopher Currens
Solution #3
You can just just use the word Marshal. Make a copy of the bitmap data. There is no need for an intermediary memorystream, etc., and the memory copy is quick. Both 24-bit and 32-bit bitmaps should work with this.
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);
}
}
.
Answered by deegee
Solution #4
Grab the byte array after saving the image to a 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();
}
Answered by Chris Baxter
Solution #5
Instead of a FileStream, use a MemoryStream like this:
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
Answered by Jeff Reddy
Post is based on https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-array