2010-02-03 5 views
4

Il semble y avoir beaucoup de questions sur l'image, mais je n'en ai trouvé aucune qui permette de changer le contenu d'une image en bitmap qui n'était pas simplement chargé à partir d'un fichier.Comment puis-je charger un bitmap généré dans un PictureBox?

Mon application prend un tableau d'octets et génère un bitmap à partir d'eux. Je veux vraiment éviter d'écrire dans un fichier en tant qu'étape de traitement intermédiaire. Comme il s'agit d'un tableau d'octets, et non de mots de 2 octets, j'ai dû créer une image bitmap indexée avec une palette d'échelle de gris. J'ai ensuite converti le bitmap indexé à un bitmap normal (24 bit bit).

C'est le code qui provoque une erreur pour moi:

pictureBox1.Image = (System.Drawing.Image)bmp2; 

Quand je considère la forme (le picturebox essaie de tirer), le fil arrêtera simplement l'exécution avec un message: « paramètre non valide at System.Drawing.Image.get_RawFormat() "

Qu'est-ce que je fais mal? Comment puis-je créer un bitmap sécurisé pour la zone d'image?

C'est ce qui crée "BMP2":

//creating the bitmap from the array 
System.Drawing.Bitmap bmp1 = new System.Drawing.Bitmap(100, 100, 100, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, MyIntPtr); 

//creating a proper indexed palette 
System.Drawing.Imaging.ColorPalette GrayPalette = bmp1.Palette; 
for (int i = 0; i < GrayPalette.Entries.Length; i++) 
{ 
    GrayPalette.Entries[i] = Color.FromArgb(i, i, i); 
} 
bmp1.Palette = GrayPalette; 

//creating a non-indexed, 24bppRGB bitmap for picturebox compatibility 
System.Drawing.Bitmap bmp2 = new Bitmap(bmp1.Width, bmp1.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
Graphics gr = Graphics.FromImage(bmp2); 
gr.DrawImage(bmp1, 0, 0); 
gr.Dispose(); 

Si je bmp1.Save (@ "testfile.bmp") Je reçois un bitmap parfaitement acceptable qui semble être sans anomalie. Pourquoi ne puis-je pas utiliser mon bitmap comme ma zone d'image. Image? Y a-t-il d'autres paramètres de l'image que je dois modifier avant de charger le nouveau bitmap dans celui-ci?

Répondre

4

Eh bien, j'ai trouvé le problème avec ce que je faisais.

Je vais essayer d'expliquer ce qui n'allait pas, mais en tant que non-gourou, je ne suis pas sûr de la précision que je vais être.

Apparemment, le réglage de l'image dans un PictureBox ne copie pas la mémoire. Plus tard dans mon application (quelques fonctions éloignées de l'extrait de code que j'ai montré) je disposais de la variable "bmp1".

Je n'étais pas au courant que la mémoire associée à bmp1 était la même mémoire partout où la fonction passe, et en la détruisant, l'erreur "paramètre invalide à System.Drawing.Image.get_RawFormat()" a été soulevée. Je suppose que c'est le cas parce que chaque fois que le PictureBox est redessiné, il utilise sa propriété "Image" pour, bien, dessiner. Parce que je disposais de la mémoire associée à la propriété "Image", je supprimais tous les espoirs de l'événement picturebox_Paint fonctionnant correctement. J'espère seulement que je n'ai pas de fuites de mémoire maintenant parce que je ne me débarrasse jamais des bitmaps que je crée.

+0

Le GC devrait prendre soin de la mémoire. – SLaks

+0

@ SLaks: Le GC s'occupera de la mémoire, mais ne libèrera pas les ressources natives utilisées par l'objet Bitmap. Il y a une raison pour l'interface IDisposable, utilisez-la. –

+0

@EdSwangren: ** Mauvais **. Les objets 'IDisposable' qui possèdent des ressources natives disposeront les ressources natives dans le finaliseur. Voir le motif Dispose. – SLaks

Questions connexes