color picker

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

color picker

Beitrag von Delle »

hallo,

ich suche einen color picker in pb wie so einer:

http://www.purearea.net/pb/CodeArchiv/G ... rPicker.pb

er sollte allerdings natürlich auch farben außerhalb des
eigenen fenster anzeigen können :-)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Einen Code kann ich leider nicht posten, aber ich habe dir mal geschrieben, was ich letztens gefunden habe.

http://www.vbarchiv.net/vbapi/GetPixel.php
Mit diesem Befehl aus der MSDN Library gibt Windows dir zurück, welchen Farbwert der Pixel (457|114) hat. So weit ich das verstanden habe, funktioniert das auch außerhalb des eigenen PB-Fensters.

Notation in PureBasic:

Code: Alles auswählen

farbe=GetPixel_(... hier alle Parameter setzen ...)
; 'farbe' enthält nun die Farbe als Zahl zwischen 0 und 2^24
rot_anteil=Red(farbe)          ;
gruen_anteil=Green(farbe)      ; speichert aus der ganzen Zahl die einzelnen Anteile
blau_anteil=Blue(farbe)        ;
; Für einige operationen braucht man den ganzen Farbwert, ohne ihn zu zerlegen.
; Aber z. B. ClearScreen() braucht die einzelnen Farbwerte:
; Notation (Schreibweise):
; ClearScreen(rot_anteil, gruen_anteil, blau_anteil)
; also so
ClearScreen(0, 0, 255)
; ...säubert den Bildschirm mit meiner Lieblingsfarbe, blau
; Willst du die Farbe in der Variablen 'farbe' benutzen, dann müsstest du hier schreiben:
ClearScreen(rot_antil, gruen_anteil, blau_anteil)
So, das war's. Ich hoffe ich konnte dir helfen.
Übrigens: Benutze mal in PB den ColorRequester(). Damit kannst du wie in Paint manuell eine Farbe aussuchen, der dann in einer ganzen Zahl zwischen 0 und 2^24 (2 hoch 24 = 16.777.216) gespeichert wird, die du bei Bedarf "auseinandernehmen" kannst, mit den Red(), Green() und Blue() Befehlen.

Schau vorsichtshalber alle Befehle nochmal in der Hilfe nach.

Gruß, AND51
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag von Delle »

ColorRequester kenn ich, brauch aber wirklich die Farbe eines bestimmten Pixels auf dem Screen.

Hast Du den Code oben mal angeschaut? Das ist auch GetPixel_ drin, aber es gibt eben nur die Farben aus dem eigenen Fenster wieder...
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hast Du den Code oben mal angeschaut? Das ist auch GetPixel_ drin, aber es gibt eben nur die Farben aus dem eigenen Fenster wieder...
Das wust ich nicht. Ich dachte, der gibt einen beliebigen pixel wieder...
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Dafür kann man GetPixel_() nehmen, das gibt die Farbe zurück.

Code: Alles auswählen

;
; Danilo, 2005/10/21
;
Procedure UpdateZoom(x,y)
  hDC1 = StartDrawing(ImageOutput())
  If hDC1
    hDesk = GetDesktopWindow_()
    hDC2  = GetWindowDC_(hDesk)
    If hDC2
      ;SetStretchBltMode_(hDC1,#COLORONCOLOR)
      StretchBlt_(hDC1,0,0,180,180,hDC2,x-4,y-4,9,9,#SRCCOPY)
      ReleaseDC_(hDesk,hDC2)
    EndIf
    DrawingMode(4)
    Box(80,80,20,20,$FFFFFF)
    StopDrawing()
  EndIf
EndProcedure

Procedure GetDeskColor(x,y)
  hDesk = GetDesktopWindow_()
  hDC   = GetWindowDC_(hDesk)
  If hDC
    color = GetPixel_(hDC,x,y)
    ReleaseDC_(hDesk,hDC)
  EndIf
  ProcedureReturn color
EndProcedure


OpenWindow(0,0,0,310,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Color")
  CreateGadgetList(WindowID())
  ImageGadget(0, 10,10,180,180,CreateImage(0,180,180))
  ImageGadget(1,200,10,100,100,CreateImage(1,100,25))
  TextGadget(2,200,45,100,20,"R: 00")
  TextGadget(3,200,65,100,20,"G: 00")
  TextGadget(4,200,85,100,20,"B: 00")

DefType.POINT mouse, old_mouse

Repeat
  Event = WindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      End
    Default
      GetCursorPos_(mouse)
      If (mouse\x <> old_mouse\x) Or (mouse\y <> old_mouse\y)
        old_mouse\x = mouse\x
        old_mouse\y = mouse\y

        UseImage(0)
        UpdateZoom(mouse\x,mouse\y)
        SetGadgetState(0,ImageID())

        UseImage(1)
        color = GetDeskColor(mouse\x,mouse\y)
        If StartDrawing(ImageOutput())
          Box(0,0,100,25,color)
          StopDrawing()
        EndIf
        SetGadgetState(1,ImageID())
        
        SetGadgetText(2,"R: "+RSet(Hex( Red(color) ),2,"0"))
        SetGadgetText(3,"G: "+RSet(Hex(Green(color)),2,"0"))
        SetGadgetText(4,"B: "+RSet(Hex(Blue(color) ),2,"0"))

      Else
        If Event=0
          Delay(5)
        EndIf
      EndIf
  EndSelect
ForEver
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag von Delle »

Hm, von GetPixel_ reden wir ja die ganze Zeit ;)

Aber Deine Version scheint auch auf dem kompletten Screen zu funzen...
Antworten