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 :)
4 réponses
B.Clone(new Rectangle(0, 0, B.Width, B.Height), B.PixelFormat)
vous pouvez sérialiser le bitmap et ensuite le désérialiser. Bitmap est sérialisable.
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);
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.