2016-11-16 2 views
0

Relevante Code:System.ArgumentException auf zurück Bitmap

private Bitmap GetScreenShot() 
    { 
     Bitmap screenImage = null; 

     using (screenImage = new Bitmap(panelPreview.Width, panelPreview.Height)) 
     { 
      using (Graphics g = Graphics.FromImage(screenImage)) 
      {      
       Rectangle rectanglePanelVideoPreview = panelPreview.Bounds; 
       Point sourcePoints = panelPreview.PointToScreen(new Point(panelPreview.ClientRectangle.X, panelPreview.ClientRectangle.Y)); 
       g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size); 
      }     
     } 

     return screenImage; 
    } 

Bitmap screenImage eine Ausnahme auslöst, wie ich Schritt durch den Code und erhalten zu

return screenImage 

Screenshot

Aus irgendeinem Grund die Integrität der Bitmap schlägt fehl, nachdem es

using (screenImage = new Bitmap(panelPreview.Width, panelPreview.Height)) 
{... 
} 
verlässt

Irgendwelche Hilfe würde geschätzt, danke.

+0

Warum nicht vorhandene Proben wie [so] wiederverwenden (http://stackoverflow.com/questions/362986/capture-the-screen-into-a-bitmap) –

+0

'Using' disposed die Bitmap. Nichts kann es benutzen, sobald Sie es zurückgeben. Entfernen Sie den äußeren Verwendungsblock und geben Sie nur die Bitmap zurück. Dann, wenn Sie es im Rest des Codes verwenden, können Sie es entsorgen. – FloatingKiwi

+0

@LeiYang Ich habe versucht, es zu trennen, also könnte ich es woanders verwenden, ohne den Code mehrmals neu zu schreiben, aber ich kann es umgehen. Vielen Dank für Ihre Hilfe. – Pearcy

Antwort

2

Dies geschieht, weil der Code:

using (screenImage = ...) 
{ 
} 

kurz aus screenImage entsorgen. Was Sie also zurückgeben, ist ein entsorgtes Objekt.

Eine leichte Modifikation des Codes der using wird das Problem beheben zu entfernen:

private Bitmap GetScreenShot() 
{ 
    Bitmap screenImage = new Bitmap(panelPreview.Width, panelPreview.Height)) 
    using (Graphics g = Graphics.FromImage(screenImage)) 
    {      
     Rectangle rectanglePanelVideoPreview = panelPreview.Bounds; 
     Point sourcePoints = panelPreview.PointToScreen(new Point(panelPreview.ClientRectangle.X, panelPreview.ClientRectangle.Y)); 
     g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size); 
    }     

    return screenImage; 
} 

Aber man sollte nicht vergessen, Dispose an diesem Bitmap zu rufen, wenn Sie es mit fertig sind. Vor allem, wenn du das oft tust.

+0

Vielen Dank für Ihre Hilfe. funktioniert jetzt perfekt. – Pearcy

0

Es sollte auch erwähnt werden, dass das Zurückgeben einer Bitmap wie dieser zu einem Speicherverlust führen kann, wenn die Bitmap in der Rückgabefunktion nicht ordnungsgemäß entsorgt wird. Die Antwort von Jim oben wird Ihr Programm lösen, damit es keinen Laufzeitfehler mehr hat, aber solange die Bitmap nicht ordnungsgemäß entsorgt wird, hat der GC wahrscheinlich eine Verzögerung bei der Rückgabe des Speichers. Ich muss die Bitmap, wo sie zurückgegeben wurde, manuell auflösen().

Verwandte Themen