2009-08-06 3 views
0

J'essaie de superposer une image avec quelques autres images. J'utilise ce code pour faire cela:superposition d'images avec GDI +

Dim gbkn As Bitmap = New Bitmap(7001, 7001, Imaging.PixelFormat.Format32bppArgb) 
Dim g As Graphics = Graphics.FromImage(CType(gbkn, Image)) 
g.DrawImage(Image.FromFile("C:\background.png"), New Point(0, 0)) 
g.DrawImage(Image.FromFile("C:\firstlayer.png"), New Point(0, 0)) 
g.DrawImage(Image.FromFile("C:\secondlayer.png"), New Point(0, 0)) 

Cela fonctionne avec les deux premières images. Après cela, une exception OutOfMemoryException est levée. Je réalise que la taille des images est grande. Mais n'est-il pas possible de faire les superpositions et de les chaéger quelque part?

Même si je sauvegarde le résultat de la première superposition sur le disque, libère de la mémoire et ajoute un autre calque, je reçois toujours l'exception.

Comment aborder ce problème?

Josp

Répondre

0

Je ne sais pas si c'est réellement le problème, mais vous ne disposez pas des images que vous dessinez sur le bitmap. est-ce que cela aide?

Dim gbkn As Bitmap = New Bitmap(7001, 7001, Imaging.PixelFormat.Format32bppArgb) 
Dim g As Graphics = Graphics.FromImage(CType(gbkn, Image)) 
Dim img As Image = Image.FromFile("C:\background.png") 
g.DrawImage(img, New Point(0, 0)) 
img.Dipose() 
img As Image = Image.FromFile("C:\firstlayer.png") 
g.DrawImage(img, New Point(0, 0)) 
img.Dispose() 
img As Image = Image.FromFile("C:\secondlayer.png") 
g.DrawImage(Image.FromFile("C:\secondlayer.png"), New Point(0, 0)) 
img.Dispose() 

Je doute sérieusement qu'il n'a rien à voir avec les images, comme je l'ai travaillé avec des images 2-3 fois cette taille sans ce problème. Aussi Exception OutOfMemoryError semble être l'un des <sarcasme> extrêmement utiles erreurs/sarcasm > que GDI jette qui n'a souvent rien à voir avec la mémoire.

+0

Spot on! C'était exactement le problème! Je ne peux pas croire que j'ai oublié cela. Merci beaucoup, beaucoup Kris! –

0

Avez-vous besoin le premier bitmap vide? Sans elle, vous allouez seulement 3 * 200 Mo au lieu de 4 * 200 Mo, peut-être cela fonctionnera:

Dim g As Graphics = Graphics.FromImage("C:\background.png") 
g.DrawImage(Image.FromFile("C:\firstlayer.png"), New Point(0, 0)) 
// and so on 

Il est étrange que superposant en plusieurs étapes ne fonctionne pas, je pense que vous n'êtes pas libérer correctement la mémoire dans ce cas. Peut-être qu'il vaudra mieux poster le code que vous utilisez pour cette approche. Je suppose également que vous avez besoin des images originales ailleurs ou que vous voulez spécifiquement faire cela en utilisant C#/GDI +, car il serait très facile de fusionner les fichiers PNG en utilisant certains programmes d'édition d'image.

+0

Le premier vide est uniquement présent car l'objet Graphics ne peut pas être instancié à partir d'un format d'image indexé. –

+0

Entre les différentes étapes, j'ai essayé d'appeler la méthode Dispose sur l'objet Graphics juste après avoir appelé la méthode DrawImage. J'ai même essayé d'enregistrer les résultats intermédiaires sur le disque puis de les recharger. Ça n'aide pas. Toujours obtenir l'exception sur la troisième image que je superpose. Pour cela, j'utiliser des appels consécutifs à l'extrait de code sous: gbkn = Image.FromFile ("c: \ _ 1.bmp") g = Graphics.FromImage (gbkn) g.DrawImage (Image.FromFile (mstrPNGs (1)), Nouveau point (0, 0)) gbkn.Dispose() g.Dispose() –

+0

Et oui, les fichiers PNG ne peuvent pas être fusionnés auparavant par un autre programme. Cela doit être fait dans ce programme Et merci beaucoup d'avoir aidé! Je me sentais très seul à ce sujet ces derniers jours ... –