Matthew
Matthew

Reputation: 366

Bitmap.Save vs File.WriteAllBytes

I have a byte array (imgBuffer) which contains the rgb values for a jpeg image. I would like to save this to a Bitmap. When I use System.IO.File.WriteAllBytes("fileImg.jpg", imgBuffer); I am able see the image in my directory in its correct format. The image gets corrupted when I try to write the same byte array, imgBuffer, to a Bitmap object. (The image format is 24bpp, 320x240)

BitmapData data;
Bitmap myBitmap = new Bitmap(320, 240, PixelFormat.Format24bppRgb);
//convert bytes to a bitmap
data = myBitmap .LockBits(new Rectangle(Point.Empty, bitmapResized.Size), ImageLockMode.WriteOnly,
                                  PixelFormat.Format24bppRgb);
Marshal.Copy(imgBuffer, 0, data.Scan0, imgBuffer.Length);
myBitmap .UnlockBits(data);
myBitmap .Save("bitmapImg.jpg");

What must I change so that bitmapImg is correctly outputted to my directory? I am currently getting the following corrupted image.

enter image description here

Upvotes: 1

Views: 2068

Answers (2)

David
David

Reputation: 34563

If you can save your imgBuffer byte array to disk and read it as a JPEG in an image viewer, then it is not the raw RGB values for the image.

You can load a Bitmap from a stream and use the data in imgBuffer as your source, and you will get a Bitmap object back that you can use.

Upvotes: 2

JaredPar
JaredPar

Reputation: 755121

I believe the problem here is that the Bitmap code assumes the data is in the bitmap format. The Save method first converts that to jpg and then saves it out. In this case it is already in the jpg format hence converting jpg to jpg is corrupting the image. In the File.WriteAllBytes method it just directly saves hence there is no corruption

Upvotes: 0

Related Questions