2011-05-04 2 views
17

J'ai affaire à des bitmaps dans mon application et pour certaines raisons, j'ai besoin de créer une copie profonde de l'image bitmap. Existe-t-il une manière élégante de le faire?Comment créer une copie en profondeur Bitmap

J'ai essayé

Bitmap deepCopy = original.Clone(); 

, bien apparemment, cela ne crée pas une copie en profondeur, mais peu profonde. Ma prochaine tentative était de créer une nouvelle image

Bitmap deepCopy = new Bitmap(original); 

Malheureusement, ce constructeur est Bitmap (Image), non Bitmap (Bitmap) et Bitmap (Image) vous permet de convertir ma belle 8bppIndexed PixelFormat dans un autre.

Une autre tentative d'utilisation d'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 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 cela :)

Répondre

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

Fonctionne merveilleusement pour moi. Pas besoin de sérialiser/dé-sérialiser par nous même. – Marcel

+0

Pour une bonne discussion des diverses options de clonage bitmap, y compris la façon dont ces options fonctionnent et fonctionnent, voir [cette réponse SO] (http://stackoverflow.com/a/13935966/3367144). – kdbanman

+2

Ce n'est pas une copie profonde. Ce qui suit semble fonctionner pour moi http://stackoverflow.com/questions/43039099/creating-a-completely-new-copy-of-bitmap-from-a-bitmap-in-c-sharp/43042865#43042865 – Ultraviolet

1

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

+0

+1 - C'est exactement ce que j'ai fait autour de la copie peu profonde par rapport à la copie profonde dans le passé – Dave

+0

-1, car il n'est pas nécessaire de sérialiser (Au moins pas dans .NET 4.0). Voir la réponse @George Duckett. – Marcel

1

Une autre façon de trouver la même chose est de faire pivoter ou retourner l'image. Sous le capot qui semble créer une copie complètement nouvelle de l'image 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); 
+0

vous copiez deux fois – sam

0

Supposons que vous disposez déjà d'un bitmap original appelé avec quelque chose dans ce

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 d'en tirer l'original dans la copie.

+0

Il perd cependant le format de couleur original. Le résultat sera toujours 32bpp ARGB. – Nyerguds

Questions connexes