Come creare una copia profonda Bitmap

Ho a che fare con Bitmap nella mia applicazione e per alcuni scopi ho bisogno di creare una copia profonda della Bitmap. C’è un modo elegante come farlo?

Provai

Bitmap deepCopy = original.Clone(); 

, a quanto pare questo non crea una copia profonda, ma superficiale. Il mio prossimo tentativo è stato quello di creare una nuova bitmap

 Bitmap deepCopy = new Bitmap(original); 

Sfortunatamente questo costruttore è Bitmap (Immagine), non Bitmap (Bitmap) e Bitmap (Immagine) convertirà il mio simpatico 8bppIndexed Pixelformat in un altro.

Un altro tentativo era l’uso di un MemoryStream

 public static Bitmap CreateBitmapDeepCopy(Bitmap source) { Bitmap result; using (MemoryStream stream = new MemoryStream()) { source.Save(stream, ImageFormat.Bmp); stream.Seek(0, SeekOrigin.Begin); result = new Bitmap(stream); } return result; } 

Bene, questo non funziona neanche, dal momento che il MemoryStream deve essere aperto durante l’intera vita di Bitmap.

Quindi, ho riassunto tutti i miei deadends e mi piacerebbe davvero vedere un modo elegante per creare una copia deep bitmap. Grazie per quello 🙂

 B.Clone(new Rectangle(0, 0, B.Width, B.Height), B.PixelFormat) 

È ansible serializzare la bitmap e quindi deserializzare. Bitmap è serializzabile.

Un altro modo in cui sono incappato in ciò che realizza la stessa cosa è ruotare o capovolgere l’immagine. Sotto il cofano sembra creare una copia completamente nuova della bitmap. Facendo due rotazioni o salti mortali ti ritroverai con una copia esatta dell’immagine originale.

 result.RotateFlip(RotateFlipType.Rotate180FlipX); result.RotateFlip(RotateFlipType.Rotate180FlipX); 

Supponiamo che tu abbia già una bitmap chiamata originale con qualcosa in essa

 Bitmap original = new Bitmap( 200, 200 ); Bitmap copy = new Bitmap(original.Width, original.Height); using (Graphics graphics = Graphics.FromImage(copy)) { Rectangle imageRectangle = new Rectangle(0, 0, copy.Width, copy.Height); graphics.DrawImage( original, imageRectangle, imageRectangle, GraphicsUnit.Pixel); } 

Questo dovrebbe creare una copia delle stesse dimensioni e disegnare l’originale nella copia.