Je crée une application (formulaire Windows) qui permet à l'utilisateur de prendre une capture d'écran en fonction des emplacements qu'ils choisissent (faites glisser pour sélectionner la zone). Je voulais ajouter un petit "volet de prévisualisation" qui a zoomé dans l'utilisateur afin que l'utilisateur puisse sélectionner la zone qu'ils souhaitent plus précisément (pixels plus grands). Sur un événement de MouseMove, j'ai un code suivant ...
bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
6 Réponses :
Hors de la mémoire en imagerie C # est généralement signe de mauvais rect ou point - start code> a négatif x ou y fortre> lorsque l'erreur se produit ou
En regardant le code qui est certainement possible. start.x est Curpos.x - 50 (idem pour la valeur Y). Alors, que se passe-t-il quand Curpos.x ou Curpos.Y de moins de 50 ans?
J'ai vérifié cela, et je pense que vous avez peut-être raison, j'essayais du bord de l'écran ... Alors, ce que je faisais a été essayé du milieu et que cette erreur s'est échappée encore une autre. Le paramètre n'est pas valide. dans mon programme.cs - application ligne.run (); (Je n'ai aucune forme réelle qui est utilisée, sa seule application d'icône de notification.
Si vous créez de nouveaux bitmaps de plus et encore, vous devrez peut-être appeler gc.collect (); code> qui obligera C # à des ordures collecter p>
Je pense que les bitmaps utilisent la mémoire non gérée, alors disposer de la mémoire.
Essayé appelant gc.Collect juste avant zoombox.Image = shownoombox (e.location); Dans la souris, déplacez-vous même et échoue toujours.
Au lieu de GC.Collect, vous devriez disposer () les bitmaps dont vous n'avez plus besoin!
Vous devez vérifier si la curlocation.x est supérieure à 50, sinon votre rectangle commencera dans la zone négative (et bien sûr curlocation.y) p>
Oui, j'ai besoin d'ajouter cela à mon code, cependant, ce n'était toujours pas la cause de la question.
Si la zone de zoom s'éteint le bord de la zone de bureau, lorsque vous essayez de récolter, vous demandez au système de créer une nouvelle image qui inclut des pixels en dehors de la zone de mémoire vidéo. Assurez-vous de limiter votre zone de zoom afin qu'aucun de ses extensions ne soit inférieur à 0 ou supérieur à celui des bords d'écran. P>
MSDN explique qu'un où Vérifiez que le paramètre dans gdi + un OutofMemoryException code > signifie p>
rect code> est en dehors des limites de bitmap source p>
blockQuote>
rect code> est le premier paramètre à la méthode
bitmap.clone code>. p>
CropArea code> n'est pas plus grand que votre image. P>
OutofMemoryException code> ne signifie pas vraiment "de mémoire"; Le code d'erreur GDI +
Oufofmemory code> a été surchargé pour signifier différentes choses. Les raisons de cela sont historiques et bien décrites par Hans Passant dans Une autre réponse . P>
Dans ce cas, je m'attendrais à ce que .NET fasse la vérification du rectangle transmis avant de passer le code sur le GDI + et de lancer une exception appropriée si le rectangle est invalide.
Utilisez l'objet bitmap comme celui-ci:
using (Bitmap bmpImage = new Bitmap(img)) { // Do something with the Bitmap object }
Sur quelle ligne votre exception étant votre exception?
Êtes-vous déjà mis en disposition BMPcrop?
Et pourquoi créez-vous une nouvelle image recadrée sur chaque mouvement de la souris b> au lieu de réutiliser une image existante?
@Steve, Edit: indiquait la ligne qui étant jetée vers l'op @codeinchaos, je dispose de cela juste après la zoombox.invalidate (); Désolé je l'exclua, ajoutera à l'op.
@Codeinchaos, parce que j'ai besoin de l'image / la position mise à jour de la souris.
C'est le mauvais endroit pour le disposer car il n'y a pas de relation individuelle entre
invalider les appels code> et les événements de peinture. Vous devez le disposer directement avant d'attribuer une nouvelle valeur au champ code> CrocImage code>. Ou mieux réutiliser l'ancien bitmap et le remplir avec le nouveau contenu.