This code:
System.Drawing.Bitmap bpp24 = new System.Drawing.Bitmap(3, 3, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Console.WriteLine("bpp24 pixel format is " + bpp24.PixelFormat.ToString());
System.Drawing.Image bpp24image = bpp24;
Console.WriteLine("bpp24image pixel format is " + bpp24image.PixelFormat.ToString());
System.Drawing.Bitmap duplicate = new System.Drawing.Bitmap(bpp24image);
Console.WriteLine("duplicate pixel format is " + duplicate.PixelFormat.ToString());
System.Drawing.Bitmap clone = (System.Drawing.Bitmap)bpp24.Clone();
Console.WriteLine("clone pixel format is " + clone.PixelFormat.ToString());
Produces this output:
bpp24 pixel format is Format24bppRgb
bpp24image pixel format is Format24bppRgb
duplicate pixel format is Format32bppArgb
clone pixel format is Format24bppRgb
Why did duplicate's PixelFormat change? A workaround to truly duplicate a Bitmap seems to be the object-level Clone method as shown last (and the Bitmap-level Clone method, but that takes some extra typing), but why can't the higher-level Bitmap(Image) constructor be used to duplicate the Bitmap?
Also see Bitmap deep copy changing PixelFormat and Converting Bitmap PixelFormats in C#.