Farbe eines Bildpunktes bestimmen

hotschen

Erfahrenes Mitglied
Hallo zusammen.
Ich schreibe gerade eine kleine Anwendung, die mir nach Eingabe der Koordinaten die Farbe dieses Punktes von einem Bild liefert. Dazu lade ich ein Bild in eine Picturebox und frage die Farbe über .point(x,y) ab. Wird das Bild auf der Form komplett angezeigt...keine Probleme. Ist das Bild (und somit die Picturebox) jedoch grösser als die Form, klappt das bei aussenliegenden Koordinaten nicht mehr. (Ebenso, wenn ich visible auf false setze)

Hat jemand eine Idee wie man das Problem lösen kann? (Das Bild muss/soll nicht unbedingt angezeigt werden)

Gruß hotschen
 
Hm, das kann ich mir irgendwie gar nicht vorstellen. Denn bei mir funktioniert es einwandfrei (meine PictureBox ist unsichtbar). Ist die PictureBox auch wirklich so groß wie das Bild? Wenn du's nicht hinkriegst kann ich dir mal einen Code schreiben, wie ich es meistens mache.
 
Habs leider nicht gebacken gekriegt. Wäre schön, wenn du mir ein Beispiel zeigst. Meins sieht so aus:
Code:
Private Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Long, _
    ByVal nXPos As Long, ByVal nYPos As Long) As Long  
Private Declare Function SetPixel Lib "gdi32.dll" (ByVal hdc As Long, _
    ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long    

Private Sub Command1_Click()  
Dim xcol, ycol As Long
    xcol = CInt(Text1.Text)
    ycol = CInt(Text2.Text)
    Picture1.ScaleMode = vbPixels
    col_long = GetPixel(Picture1.hdc, xcol, ycol)
    Picture1.Circle (xcol, ycol), 10
    Label1.Caption = col_long  
End Sub
Solange die Pixel im sichtbaren Bereich der Form liegen...kein Problem, wenn aber ausserhalb oder picture1.visible=false, dann klappt es nicht mehr.
 
Ich hab dir mal ein kleines Projekt gemacht: GetPixel.zip
Die schwarte PictureBox stellt dabei die unsichtbare PictureBox da, welche das Bild enthalten soll. Wenn du die Maus über die blaue PictureBox bewegst, dann wird die Pixelfarbe des Bildes auf der unsichtbaren schwarzen PictureBox abgefragt.
 

Anhänge

Zuletzt bearbeitet:
Erstmal Danke für das Beispiel.
Ich versteh's nicht, stehe irgendwie grade aufm Schlauch. So klappts ja wunderbar, aber versuch mal die Farbabfrage mit expliziter Angabe der Koordinaten, das will bei mir einfach nicht.
Bin jetzt einen anderen Weg gegangen. Habe die Picturebox in eine andere gepackt und verschiebe sie jetzt je nach Koordinaten. Zwar etwas umständlicher, aber so funktionierts.

Würde mich aber dennoch intressieren, wie das direkt geht.
 
Du willst also beispielsweise die Farbe am fest vorgegebenen Punkt x=3/y=4 haben? Das müsste normalerweise so gehen:
Code:
Farbe = "Farbe im Punkt 3/3: " & GetPixel(Me.picBild.hdc, 3, 3)
Ich kann mir beim besten Willen nicht vorstellen, warum es so bei dir nicht gehen sollte. Kannst du mal deinen ganzen Code posten (und nicht nur den, den du von dem genannten Link übernommen hast) oder gleich dein Projekt hochladen?
 
Ich habe hier mal eine Beispieldatei angehangen, die das Problem deutlich macht. Versuche bspw. bei der Startgröße der Form den Punkt (300,300) abzufragen, du erhälst '-1'. Vergrößerst du die Form, erhältst du den gesuchten Farbwert.
 

Anhänge

Hi
setze einfach mal die Autoredraw Eigenschaft der Picturebox auf True. Meine mal irgendwo gelesen zu haben, dass nur bei gesetzter Autoredraw Eigenschaft ein permanentes DC der Picturebox gehalten wird.

Gruß
Das Orakel
 
Zuletzt bearbeitet:
Zurück