47 votes

C# Image.Clone Exception de mémoire insuffisante

Pourquoi est-ce que je reçois une exception d'absence de mémoire ?

Donc ça meurt en C# du premier coup :

splitBitmaps.Add(neededImage.Clone(rectDimensions, neededImage.PixelFormat)) ;

Où splitBitmaps est une liste<BitMap> MAIS cela fonctionne en VB pour au moins 4 itérations :

arlSplitBitmaps.Add(Image.Clone(rectDimensions, Image.PixelFormat))

Où arlSplitBitmaps est une simple liste de tableaux. (Et oui j'ai essayé arraylist en c#)

C'est la section complète :

for (Int32 splitIndex = 0; splitIndex <= numberOfResultingImages - 1; splitIndex++)
{ 
  Rectangle rectDimensions;

  if (splitIndex < numberOfResultingImages - 1) 
  {
    rectDimensions = new Rectangle(splitImageWidth * splitIndex, 0, 
      splitImageWidth, splitImageHeight); 
  } 
  else 
  {
    rectDimensions = new Rectangle(splitImageWidth * splitIndex, 0, 
     sourceImageWidth - (splitImageWidth * splitIndex), splitImageHeight); 
  } 

  splitBitmaps.Add(neededImage.Clone(rectDimensions, neededImage.PixelFormat));

}

neededImage est un Bitmap d'ailleurs.

Je ne trouve aucune réponse utile sur l'internet, et surtout pas pourquoi cela fonctionne très bien en VB.

Mise à jour :

J'ai en fait trouvé une raison (en quelque sorte) pour que cela fonctionne mais j'ai oublié de la poster. Il s'agit de convertir l'image en bitmap au lieu d'essayer de cloner l'image brute si je me souviens bien.

160voto

TomA Points 5600

Clone() peut également lever une exception de mémoire lorsque les coordonnées spécifiées dans le Rectangle sont en dehors des limites de l'image bitmap. Elle ne les découpe pas automatiquement pour vous.

9voto

user3283232 Points 1

J'ai découvert que j'utilisais Image.Clone pour recadrer un bitmap et que la largeur faisait sortir le recadrage des limites de l'image originale. Cela provoque une erreur de mémoire insuffisante. Cela semble un peu étrange mais cela peut valoir la peine de le savoir.

6voto

Andy Points 756

J'ai également rencontré ce problème lorsque j'ai essayé d'utiliser la méthode Clone() pour modifier le format de pixel d'un bitmap. Si ma mémoire est bonne, j'essayais de convertir un bitmap de 24 bpp en un format indexé de 8 bits, en espérant naïvement que la classe Bitmap se chargerait comme par magie de la création de la palette et ainsi de suite. Apparemment pas :-/

4voto

Mike L Points 2028

C'est un peu exagéré, mais j'ai souvent constaté que si l'on extrait des images directement du disque, il est préférable de les copier dans un nouveau bitmap et de se débarrasser de l'image liée au disque. J'ai constaté une grande amélioration de la consommation de mémoire en procédant ainsi.

Dave M. a raison aussi... assurez-vous de vous débarrasser de vos déchets lorsque vous avez terminé.

3voto

Dave Markle Points 44637

Assurez-vous que vous appelez correctement .Dispose() sur vos images, sinon les ressources non gérées ne seront pas libérées. Je me demande combien d'images vous créez réellement ici - des centaines ? Des milliers ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X