without - copie objet c#




Comment créer une copie profonde Bitmap (3)

Vous pouvez sérialiser le bitmap, puis le désérialiser. Bitmap est sérialisable.

J'ai affaire à Bitmaps dans mon application et pour certaines raisons j'ai besoin de créer une copie profonde de la Bitmap. Existe-t-il une manière élégante de le faire?

j'ai essayé

Bitmap deepCopy = original.Clone();

, bien apparemment cela ne crée pas une copie profonde, mais superficielle. Ma prochaine tentative a été de créer un nouveau bitmap

Bitmap deepCopy = new Bitmap(original);

Malheureusement, ce constructeur est Bitmap (Image), pas Bitmap (Bitmap) et Bitmap (Image) va convertir mon joli Pixelformat 8bppIndexed en un différent.

Une autre tentative était d'utiliser 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;
}

Eh bien, cela ne marche pas non plus, puisque le MemoryStream doit être ouvert pendant toute la durée de vie de Bitmap.

Donc, j'ai résumé tous mes deadends et j'aimerais vraiment voir une façon élégante de créer une copie en profondeur Bitmap. Merci pour ça :)


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

Supposons que vous avez déjà un bitmap appelé original avec quelque chose dedans

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);
}

Cela devrait créer une copie de la même taille et dessiner l'original dans la copie.





deep-copy