C# en Dehors de la Mémoire lors de la Création d'image Bitmap
Je suis en création d'une application (Windows Form) qui permet à l'utilisateur de prendre une capture d'écran sur la base des lieux de leur choix (faites-le glisser pour sélectionner la zone). Je voulais ajouter un peu de "volet de visualisation" c'est le zoom de sorte que l'utilisateur peut sélectionner la région où ils veulent plus précisément (plus de pixels). Sur un événement mousemove j'ai le code suivant...
private void falseDesktop_MouseMove(object sender, MouseEventArgs e)
{
zoomBox.Image = showZoomBox(e.Location);
zoomBox.Invalidate();
bmpCrop.Dispose();
}
private Image showZoomBox(Point curLocation)
{
Point start = new Point(curLocation.X - 50, curLocation.Y - 50);
Size size = new Size(100, 90);
Rectangle rect = new Rectangle(start, size);
Image selection = cropImage(falseDesktop.Image, rect);
return selection;
}
private static Bitmap bmpCrop;
private static Image cropImage(Image img, Rectangle cropArea)
{
if (cropArea.Width != 0 && cropArea.Height != 0)
{
Bitmap bmpImage = new Bitmap(img);
bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
bmpImage.Dispose();
return (Image)(bmpCrop);
}
return null;
}
La ligne qui échoue et a les de Mémoire exception est la suivante:
bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
Fondamentalement, ce que ce n'est qu'il faut 100x90 rectangle autour du pointeur de la souris et tire que dans la zoomBox, qui est un contrôle picturebox. Cependant, dans le processus, j'obtiens une erreur De Mémoire insuffisante. Qu'est-ce que je fais de manière incorrecte ici?
Merci pour votre aide.
Avez-vous de l'élimination bmpCrop?
Et pourquoi êtes-vous créer une nouvelle image recadrée sur chaque déplacement de la souris au lieu de réutiliser une image existante?
edit: la mention de la ligne c'est d'être jeté à l'OP @CodeInChaos, je ne la jetez juste après la zoomBox.Invalidate(); Désolé, j'ai exclu, va ajouter à l'op.
parce que j'ai besoin de la mise à jour de l'image/position de la souris.
OriginalL'auteur Alex | 2010-11-30
Vous devez vous connecter pour publier un commentaire.
De la mémoire en C# d'imagerie, est habituellement un signe de mauvais rect ou point - un peu de hareng rouge. Je parie
start
a négatif X ou Y quand l'erreur se produit, ou la Taille.Hauteur + Y ou de la Taille.Largeur + X est plus grand que la Hauteur ou la largeur de l'image.L'autre possibilité, j'ai juste mis à jour.
En regardant le code qui est certainement possible. commencer.x est curPos.X - 50 (même pour la valeur y). Donc ce qui arrive quand curPos.x ou curPos.y de moins de 50?
J'ai vérifié, et je pense que vous avez peut-être raison, j'ai essayé à partir du bord de l'écran.... Donc je l'ai essayé à partir du milieu et que l'erreur s'en alla encore un autre est venu. Paramètre n'est Pas Valide. dans mon Programme.cs -- Application de la Ligne.Run(); (je n'ai pas de forme réelle c'est utilisé, c'est juste une icône de notification de la demande.
OriginalL'auteur Aliostad
MSDN explique qu'une
OutOfMemoryException
signifieoù
rect
est le premier paramètre à laBitmap.Clone
méthode.Afin de vérifier que la
cropArea
paramètre n'est pas plus grand que votre image.Dans GDI+ un
OutOfMemoryException
n'est pas vraiment "out of memory"; le RIB+ code d'erreurOufOfMemory
a été surchargé de signifier des choses différentes. Les raisons en sont historiques et bien décrite par Hans Passant dans une autre réponse.Quelle stupide utilisation de la
OutOfMemoryException
Voir Hans réponse pour expliquer pourquoi les choses sont si stupides.
Dans ce cas, je m'attends .net pour effectuer la vérification du passé dans le rectangle avant de passer le code de la GDI+ et de lever une exception appropriée si le rectangle est pas valide.
OriginalL'auteur Dirk Vollmar
Utilisation de l'objet Bitmap comme ceci:
OriginalL'auteur Gilad Shapira
vous devriez vérifier si curLocation.X est supérieur à 50, sinon votre rectangle de départ dans la zone négative (et bien sûr curLocation.Y)
OriginalL'auteur user287107
Si la zone de zoom va à côté du bord de la zone de l'écran, puis lorsque vous essayez de la culture, vous demandez au système de faire une nouvelle image qui inclut des pixels à l'extérieur de la zone de mémoire vidéo. Assurez-vous de limiter votre zone de zoom de sorte qu'aucun de ses extensions est inférieure à 0 ou supérieure à la bords de l'écran.
OriginalL'auteur Klay
Si vous êtes à la création de nouvelles images bitmap, vous pourriez avoir besoin d'appeler
GC.Collect();
qui force C# pour collecter les orduresEssayé d'appeler GC.Recueillir Droit avant de zoomBox.Image = showZoomBox(e.Emplacement); dans le déplacement de la souris, même et ne fonctionne toujours pas.
+1 Cela m'a aidé quand j'en avais besoin.
Au lieu de GC.Recueillir Jetez - () les images que vous n'avez pas besoin de plus!
OriginalL'auteur Samuel