Die letzten 10 Beiträge |
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! |
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. |
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. |
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 |
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. |
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. |
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
|
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? |
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. |
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. |
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen. |
|
|