Comment créer une copie Bitmap deep

J'ai affaire à des Bitmaps dans mon application et pour certaines raisons j'ai besoin de créer une copie profonde du Bitmap. Y a-t-il une façon élégante de le faire?

j'ai essayé

Bitmap deepCopy = original.Clone();

, apparemment cela ne crée pas une copie profonde, mais superficielle. Ma prochaine tentative était de créer un nouveau Bitmap

Bitmap deepCopy = new Bitmap(original);

malheureusement ce constructeur est Bitmap (Image), Pas Bitmap (Bitmap) et Bitmap (Image) convertira Mon Beau 8bppindexed Pixelformat dans un différent un.

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 fonctionne 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 points morts et j'aimerais vraiment voir une belle façon élégante de créer une copie Bitmap profonde. Merci pour ça :)

19
demandé sur Biggles 2011-05-04 15:45:31

4 réponses

B.Clone(new Rectangle(0, 0, B.Width, B.Height), B.PixelFormat)
20
répondu George Duckett 2011-05-04 11:52:14

vous pouvez sérialiser le bitmap et ensuite le désérialiser. Bitmap est sérialisable.

1
répondu Erno de Weerd 2011-05-04 11:50:53

une autre façon dont je suis tombé sur qui réalise la même chose est de tourner ou de retourner l'image. Sous le capot qui semble créer une toute nouvelle copie du bitmap. Faire deux rotations ou flips vous permet de vous retrouver avec une copie exacte de l'image originale.

result.RotateFlip(RotateFlipType.Rotate180FlipX);
result.RotateFlip(RotateFlipType.Rotate180FlipX);
1
répondu sipwiz 2012-09-14 00:53:43

supposons que vous ayez 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);
}

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

0
répondu Andrew Olney 2013-01-22 08:38:17