Probleme mit FastGraphicsLib

Neue Frage »

Auf diesen Beitrag antworten »
imax2010 Probleme mit FastGraphicsLib

Hallo,

ich beschäftige mich seit einer Zeit mit VB (Visual Studio 2010) und habe die DLL gefunden.
Und zwar möchte ich die Funktion FindPixel nutzen und mir in einem Bild (Testbild mit nur einem schwarzen Pixel) die Position von diesem ausgeben lassen.
Zudem möchte ich die Anzahl der Pixel zählen. Die Googlesuche hat mir jedenfalls nichts gebracht außer rumprobiere (und keine Funktion).
Ich scheitere aber dort wo ich den Wert (x/y) in der Textbox anzeigen will. Meistens bekomme ich in der Textbox folgendes: "System.Drawing.Point[]" oder nur eine leere.

Viele Zeilen hat das Programm nicht.
Hier die Zeile wo ich den Wert in eine Variable speichern will und dann in die Textbox laden:

code:
1:
2:
3:
4:
Dim p As Array = fg.FindPixel(Color.Black, 1) 
TextBox1.Text = p.ToString


Deklaration und so stimmt schon da ich die aus dem oberen DLL-Link habe.
Hoffe jmd kann mir helfen und so mal mein Wissen erweitern.

Mfg
imax2010
 
Auf diesen Beitrag antworten »
eulerscheZahl

Das liegt daran, dass p kein Punkt ist, sondern ein Array von Punkten.
Versuche mal: TextBox1.Text = p(0).ToString()
Musst natürlich vorher sicherstellen, dass p(0) existiert, bevor du ihn ausgibst.
code:
1:
2:
3:
        If p.Length > 0 Then
            TextBox1.Text = p(0).ToString()
        End If
Auf diesen Beitrag antworten »
imax2010

Danke erstmal für deine Antwort.
Weis nicht warum aber wenn man mit deinem Code Teil den Button drückt dann passiert schlicht und einfach nichts. (P(0) existiert)

Hab durch einen Tipp folgendes Probiert:
code:
1:
2:
3:
4:
Dim pixel As New List(Of Point)  For Each p As Point In fg.FindPixel(Color.Black,1)  pixel.Add(p) Next
For i = 0 To pixel.Count
 ListBox1.Items.Add(pixel.Item(i).X & pixel.Item(i).Y)
Next


Dann bekomm ich: "Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.
Parametername: index" als Fehler.
(Wenn ich mir pixel.count auch anzeigen lasse ist das immer 0)
Hoffe mir kann wieder jmd helfen.

Mfg
imax2010
Auf diesen Beitrag antworten »
eulerscheZahl

Mit For i = 0 To pixel.Count schießt du bereits um eins über das Ziel hinaus, die Fehlermeldung ist nur konsequent.

teste mal den Code:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim fg As FastGraphicsLib.FastGraphics = FastGraphicsLib.FastGraphics.FromScreen(New Rectangle(50, 50, 200, 200))
        Dim p As Array = fg.FindPixel(Color.Black, 1)
        If p.Length > 0 Then
            TextBox1.Text = p(0).ToString()
        Else
            TextBox1.Text = "kein Punkt gefunden"
        End If
    End Sub
 
Auf diesen Beitrag antworten »
imax2010

Cool danke jetzt gibt er mir ein Koordinatenpaar aus.
Ich sehen du nimmst das ".FromScreen" d.h. dass er die aktuelle Form als Quelle nimmt oder? Ich möchte das aber von nur in der Picturebox gesucht wird.

".FromBitmap(Picturebox1.Image)" aber da steht dann nur kein Punkt gefunden. (Die Grafik ist eine Bitmapgrafik mit exakt einem Pixel (schwarz auf x=82 und y= 173).

//Edit:

Wenn ich ein Linie Mache dann bekomm ich ein Koordinatenppar angezeigt, jedoch nicht wenn nur 1 Punkt vorhanden ist.
Auf diesen Beitrag antworten »
eulerscheZahl

Bei mir das selbe: ein Punkt allein wird nicht gefunden, erst ein dicker Batzen.

Und da hat das x auch noch ein negatives Vorzeichen.
setzt man das zu +, so liegt der gefundene Punkt immer noch um ein Pixel daneben, also im Weißen.
Die Bibliothek ist wohl nicht perfekt.
Auf diesen Beitrag antworten »
imax2010

Also ich hab das jetzt auf so abgeändert:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Dim fg As FastGraphicsLib.FastGraphics = FastGraphicsLib.FastGraphics.FromBitmap(PictureBox1.Image)        
Dim p As Array = fg.FindPixel(Color.Black, 10)        
If p.Length > 0 Then              
For Each a As Point In fg.FindPixel(Color.Black, 10)                 ListBox1.Items.Add(a.X)                
ListBox2.Items.Add(a.Y)             
Next             
fg.Unlock()        
Else            
TextBox1.Text = "kein Punkt gefunden"            
fg.Unlock()        
 End If


und es listet mir alle punkte auf. Ich versuch jetzt herauszufinden welche die mindestanzahl an pixel ist (mit 8 px gehts auch nicht).

//Edit
Es ist interessant: Ich mache mit Paint ein20x20 "Rechteck" in schwarz und dann sagt er mir es sind 296 Pixel? Müssten es nicht 400 sein?
Auf diesen Beitrag antworten »
eulerscheZahl

Habe mir mal den Code angeschaut:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Public Function FindPixel(ByVal cl As Color, ByVal Optional varianz As Byte = 0) As Point()
    Dim list As New List(Of Point)
    Dim num4 As Integer = ((Me.bmp1.Width * Me.bmp1.Height) - 1)
    Dim i As Integer = 0
    Do While (i <= num4)
        Dim color As Color = Color.FromArgb(Marshal.ReadInt32(Me.p, i))
        If ((((((color.R >= If(((cl.R - varianz) < 0), 0, CByte((cl.R - varianz)))) And (color.R <= If(((cl.R + varianz) > &HFF), &HFF, CByte((cl.R + varianz))))) And (color.G >= If(((cl.G - varianz) < 0), 0, CByte((cl.G - varianz))))) And (color.G <= If(((cl.G + varianz) > &HFF), &HFF, CByte((cl.G + varianz))))) And (color.B >= If(((cl.B - varianz) < 0), 0, CByte((cl.B - varianz))))) And (color.B <= If((CByte((cl.B + varianz)) > &HFF), &HFF, CByte((cl.B + varianz))))) Then
            Dim y As Integer = CInt(Math.Round(CDbl(((CDbl(i) / CDbl(Me.bmpdata.Width)) / 3))))
            Dim x As Integer = CInt(Math.Round(CDbl(((CDbl(i) / 3) - (y * Me.bmpdata.Width)))))
            Dim item As New Point(x, y)
            list.Add(item)
        End If
        i = (i + 3)
    Loop
    Return list.ToArray
End Function

mir ist nicht klar, warum i immer gleich um 3 erhöht wird verwirrt
Auf diesen Beitrag antworten »
imax2010

Wäre das der Code der Lib?

Ich hab beobachtet, dass wenn ich in Paint ein 20x20px Feld mache mit der Auflößung(der Datei) 400x400 dann bekomm ich die richtigen Rechenwerte sprich 400px heraus. Verwende ich einen Kreis (d=60) bzw. ein Rechteck mit 160x60 so verfehlt er beim Rechteck um ca. 2000px und bei Kreis kommen statt 2827 nur 360 heraus.
Auf diesen Beitrag antworten »
eulerscheZahl

Ja, das ist das, was aus der .dll noch an Code rauszuziehen war.

Muss es denn unbedingt diese .dll sein oder kannst du dich auch mit dem Gedanken anfreunden, dir selbst ein paar Funktionen zu schreiben?

Das wäre alles viel einfacher, wenn ich VisualBasic könnte, habe mich trotzdem mal dran versucht:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
Public Class Form1

    Public Function FindPixel(ByVal farbe As Color, ByVal bmp As Bitmap) As List(Of Point)
        Dim x, y As Integer
        Dim liste As List(Of Point) = New List(Of Point)
        For x = 0 To bmp.Width - 1
            For y = 0 To bmp.Height - 1
                If bmp.GetPixel(x, y) = farbe Then
                    liste.Add(New Point(x, y))
                End If
            Next
        Next
        Return liste
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim bmp As Bitmap = PictureBox1.Image
        Dim farbe As Color = Color.FromArgb(0, 0, 0)
        Dim liste As List(Of Point) = FindPixel(farbe, bmp)
        ListBox1.Items.Clear()
        For Each p As Point In liste
            ListBox1.Items.Add(p.ToString())
        Next
    End Sub
End Class

Habe es nicht näher getestet, den einzelnen schwarzen Punkt habe ich damit aber gefunden.
Auf diesen Beitrag antworten »
imax2010

Nein muss es nicht aber scheinbar ist es so, dass die Lib schneller ist als b,p.GetPixel() aber ich hab auch bereits mit dem angefangen, nur hatte ich irgendwo ein Problem mit den Koordinaten bzw. er ging nicht in y-richtung weiter. Aber danke für deinen Code Funktioniert Perfekt!
Für eine eigene Lib mir Marshalling reicht mein Wissen bei weitem nicht (mach das nur Hobbymäsig).

Aber danke trotzdem für die Hilfe!

Mfg
Imax2010
Auf diesen Beitrag antworten »
Airblader

Ich habe zwar keine Ahnung, wie groß die VB-Community ist, aber ich kann mir nicht vorstellen, dass es nur eine einzige, frei erhältliche Bibliothek für solche elementare Funktionen gibt, die dann obendrauf noch kaputt ist.
Auf diesen Beitrag antworten »
eulerscheZahl

Dank .net kann man ja vieles in verschiedenen Sprachen verwenden, so ist es z.B. ohne Probleme möglich, oben verlinkte Bibliothek mit C# zu nutzen. Das geht natürlich auch in die andere Richtung, da sollten also schon vernüftige Bibliotheken zur Verfügung stehen.
Trotzdem würde ich nicht zu Basic raten, einfach weil die Verbreitung recht gering ist und sich entsprechend weniger Codebeispiele finden lassen.
Auf diesen Beitrag antworten »
imax2010

Ich hab auch schon andere probiert. Eine funktionierte erst gar nicht, da immer nur wirres zeug in der Textbox ausgab(fast identisch mit der FastGraphicsLib) und die andere in c# braucht auch (zumindest bei mir) einige Zeit zum auslesen der Pixel also fast vergleichbar mit bmp.GetPixel() aber ich versuchs weiterhin (bis da verwend ich das bmp.GetPixel). Sollte ich was brauchbares finden meld ich mich wieder!
 
Neue Frage »
Antworten »


Verwandte Themen