ArgumentException in System.Drawing.dll

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    ArgumentException in System.Drawing.dll

    Guten Tag,

    eventuell kann mir hier ein Wissender behilflich sein.
    Ich habe ein Programm geschrieben, welches die Farbe eines (!) Pixels auswertet.
    Dazu wird folgender Code verwendet:

    VB.NET-Quellcode

    1. Dim bmp As New Drawing.Bitmap(1, 1)
    2. Dim gra As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bmp)
    3. gra.CopyFromScreen(New Drawing.Point(x, y), _
    4. New Drawing.Point(0, 0), bmp.Size)
    5. Dim color As Drawing.Color = bmp.GetPixel(0, 0)


    Ich rufe die Farbe eines Pixels der Koordinaten x und y in einem Timer je 4x pro Tick ab.
    Das funktioniert soweit auch gut. Allerdings kommt nach einiger (Lauf-)zeit (2-3 Minuten) die Fehlermeldung bei den Zeilen 3 und 4: "Ein Ausnahmefehler des Typs "System.ArgumentException" ist in System.Drawing.dll aufgetreten. Zusätzliche Informationen: Ungültiger Parameter." und das Programm bricht ab.

    Ich kann mir momentan nicht erklären, weshalb dies der Fall ist, bzw. welcher Parameter ungültig sein sollte.
    Es würde mich freuen, wenn mir jemand Hilfestellung dazu geben könnte.

    Vielen Dank.
    Grüße,

    theSariel
    Wilkommen im Forum. :thumbup:

    theSariel schrieb:

    4x pro Tick
    Kann ich leider nicht nachvollziehen.
    Wie hoch ist denn Dein Timer.Interval?
    Probier mal mit ein Mal pro Tick.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    danke, für deine antwort... :)

    4x pro tick heißt, ich habe im timer 4x den block mit anderen variablen da sich meine koordinaten ändern.
    der interval liegt bei 1.
    wenn nur 1x pro tick ein pixel ausgewertet wird funktioniert alles hervorragend.

    ich bin jedoch irritiert, denn:
    wenn ich das ganze mehrmals im selben tick mit unterschiedlichen variablen (also: bmp, bmp2, ..., gra, gra2, ...) betreibe sollte es sich doch nicht gegenseitig beeinflussen, oder?
    der fehler tritt interessanter weise auch nur beim ersten block im tick auf.



    edit:
    es kommt auch wenn es nur 1x pro tick drin ist. erstaunlicher weiße nach ca der selben zeit.

    auch mit folgendem code das selbe ergebnis:

    VB.NET-Quellcode

    1. Dim bmp As New Bitmap(1, 1)
    2. Using g As Graphics = Graphics.FromImage(bmp)
    3. g.CopyFromScreen(New Point(x, y), New Point(0, 0), New Size(1, 1))
    4. End Using
    5. Dim color As Drawing.Color = bmp.GetPixel(0, 0)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „theSariel“ ()

    Kannst Du die Variableninhalte mal begutachten, wenn die Exception auftritt? Eventuell fällt Dir was ungewöhnliches auf.
    Und in welcher Zeile kommt die Exception eigentlich genau?
    Woher kommen die Koordinaten? Eventuell sind die ungültig (außerhalb des Bildschirmrandes z.B.).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    ich habe gerade die x und y variablen begutachtet und sie sind immer brav da, wo sie hin gehören.
    welche zeile es genau ist bin ich mir nicht sicher. markiert werden 3 + 4, 3 hat einen pfeil.

    im übrigen falle ich jetzt vom glauben ab. :?:
    ich habe zum überprüfen der variablen 2 label eingefügt und gecodet:

    VB.NET-Quellcode

    1. Label9.Text = x
    2. Label10.Text = y

    nun tritt der fehler NICHT auf.

    kann es sein, dass es mit dem timer bzw. dem rhythmus zu tun hat?! denn der o.g. code hat ja keinen effekt.
    Du sagst ja das der Fehler nur im ersten Block vorkommt aber hast du den ersten Block überhaupt schon einmal ausgeklammert/raus genommen?
    Denn dein Programm unterbricht ja direkt beim ersten Fehler und es werden nicht alle Blöcke gleichzeitig ausgeführt.

    Müsste so gehen:

    VB.NET-Quellcode

    1. Dim bmp As New Bitmap(1, 1)
    2. Using g As New Graphics = Graphics.FromImage(bmp)
    3. g.CopyFromScreen(New Point(x, y), New Point(0, 0), New Size(1, 1))
    4. End Using
    5. Dim color As Drawing.Color = bmp.GetPixel(0, 0)


    Ansonsten könntest du auch mal die Variablen Außerhalb des Timers deklarieren und dann die Werte innerhalb des Timers zuweisen.
    Sprich das "Dim bmp as Bitmap" Global deklarieren

    Und im Timer dann:

    VB.NET-Quellcode

    1. bmp = New Bitmap(1,1)


    Mfg
    Conway's Game Of Life Monogame Sample: 80%

    Conway's Game Of Life Monogame Sample
    Zeile 3 und 4 (ich nehme an, vom Codeschnipsel im Startpost) sind eine einzige Anweisung (Siehe Unterstrich am Ende), deswegen sind auch beide Zeilen markiert markiert.
    Kannst Du ein Beispiel für die Koordinaten posten, bei denen das Problem auftritt?
    Und welchen Timer verwendest Du?
    System.Windows.Forms.Timer oder System.Timers.Timer oder System.Threading.Timer?

    Label9.Text = x
    Label10.Text = y

    Das zeigt, dass Du mit Option Strict Off programmierst. Unbedingt das lesen:
    home.arcor.de/eckardahlers/Pro…/Blogs/WarumStrictOn.html
    Und das:
    Visual Studio - Empfohlene Einstellungen
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    theSariel schrieb:

    der interval liegt bei 1.
    Eine Millisekunde :?: :!: :?:
    Ändere den Wert mal auf 50 oder 100.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!