Reputation: 23624
I'm trying to use a MemoryStream
to turn an image into a byte array, however, the image looks different when I recover it.
I made a simple Form
app to show the issue. I'm using the google chrome Icon for this example:
var process = Process.GetProcessById(3876); // found pid manually
var image = Icon.ExtractAssociatedIcon(process.MainModule.FileName).ToBitmap();
pictureBox1.Image = image;
byte[] imageBytes;
using (var ms = new MemoryStream())
{
image.Save(ms, ImageFormat.Bmp);
imageBytes = ms.ToArray();
}
using (var ms = new MemoryStream(imageBytes))
{
pictureBox2.Image = (Bitmap) Image.FromStream(ms);
}
Result:
Any idea what I'm missing here?
Update I was able to get the proper bytes using the following code:
var converter = new ImageConverter();
var imageBytes = (byte[]) converter.ConvertTo(image, typeof(byte[]));
Would still like to know whats up with the Memory stream though..
Upvotes: 0
Views: 1355
Reputation: 38875
Icons are complicated. When they contain transparent parts, converting to BMP or JPG almost always seems to end badly. You also dont need ImageConverter
it is doing almost what your code does without the BMP conversion:
var process = Process.GetProcessById(844); // found pid manually
var image = Icon.ExtractAssociatedIcon(process.MainModule.FileName).ToBitmap();
pb1.Image = image;
byte[] imageBytes;
using (var ms = new MemoryStream())
{
image.Save(ms, ImageFormat.Png); // PNG for transparency
ms.Position = 0;
pb2.Image = (Bitmap)Image.FromStream(ms);
}
ImageConverter Reference Source
Upvotes: 3