Seite 1 von 1

GetPIXEL RGB-Code umwandeln *gelöst*

Verfasst: 18.07.2008 12:46
von onny
HI, ich möchte gerne einen RGB-Code aus GetPixel (http://msdn.microsoft.com/en-us/library ... S.85).aspx) in PureBasic in Red, Green, Blue umwandeln.

Ich habe das Gefühl mit den PureBasic Befehlen geht das nicht...

normalerweise muss man das so umwandeln:

Code: Alles auswählen

Dim Red as Byte 
   Dim Green as Byte
   Dim Blue as Byte

   Red = Color and &H000000FF&              'mind the ampersand at the end of constant
   Green = (Color and &H0000FF00&) / 256    'bit masking and "shift" 
   Blue = (Color and &H00FF0000&) /65535    'bit masking and "shift" 
Wie funktioniert das in PureBasic?

Verfasst: 18.07.2008 13:16
von CNESM
Ich denke du suchst das:

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/viewtopic.php?t=2887&highlight=
; Author: DarkDragon (based on code by Rings, extended by Andre)
; Date: 09. April 2005
; OS: Windows
; Demo: No


; Get the color under the mouse cursor
; Farbe des Punktes unter dem Mauscursor ermitteln

Procedure GetColorUnderMouse() 
  GetCursorPos_(@CursorPos.POINT ) 
  hDC = GetDC_(0) 
  If hDC <> 0 
    Color = GetPixel_(hDC,CursorPos\x,CursorPos\y) 
    ReleaseDC_(0, hDC) 
    ProcedureReturn Color 
  EndIf 
EndProcedure 

color.l = GetColorUnderMouse()

Debug "Color:"
Debug color

Debug "Color in Hex format:"
Debug Hex(color)

Debug "Color in RGB values:"
Debug Red(color)
Debug Green(color)
Debug Blue(color)

Verfasst: 18.07.2008 13:18
von NicTheQuick

Code: Alles auswählen

Define.l Color

Color = $1234FF


Define.b Red, Green, Blue

Red = Color & $FF
Green = (Color >> 8) & $FF
Blue = (Color >> 16) & $FF

Debug Red
Debug Green
Debug Blue
Debug ""

;oder so:

Red = Red(Color)
Green = Green(Color)
Blue = Blue(Color)

Debug Red
Debug Green
Debug Blue
Debug ""

;oder so:
Structure Color4B
  Red.b
  Green.b
  Blue.b
  Reserved.b
EndStructure

Define.Color4B *Colors = @Color

Debug *Colors\Red & $FF
Debug *Colors\Green & $FF
Debug *Colors\Blue & $FF
Allerdings musst du daran denken, dass Byte in PureBasic signed ist, also
der Wertebereich von -128 bis 127 geht und somit -1 (=255) der höchste
Wert ist.
Deswegen kannst du bei den ersten beiden Methoden entweder einfach
Long- statt Byte-Variablen nutzen, oder du schreibst hinter die Debug-
Zeilen noch ein & $FF, wie ich es bei der letzten Methode gemacht habe.

Verfasst: 18.07.2008 14:45
von Kaeru Gaman
> Wie funktioniert das in PureBasic?

praktisch genauso, nur dass du eben nicht Byte-Typen verwenden solltest,
wegen des Vorzeichens, wie schon von Nic angesprochen.

hier mal 1:1 die übersetzung deines snippets:

Code: Alles auswählen

Define Red.l
Define Green.l
Define Blue.l

Red   =  Color & $000000FF            ; in PB, the ampersand is bitwise AND
Green = (Color & $0000FF00) / 256     ;'bit masking and "shift"
Blue  = (Color & $00FF0000) /65535    ;'bit masking and "shift"
man kann übrigens auch direkt bitweise shiften:

Code: Alles auswählen

Red   =  Color & $000000FF
Green = (Color & $0000FF00) >>  8
Blue  = (Color & $00FF0000) >> 16
und man kann die PB-internen Befehle nutzen:

Code: Alles auswählen

Red   = Red(Color)
Green = Green(Color)
Blue  = Blue(Color)

Verfasst: 18.07.2008 20:49
von onny
danke hat mir weiter geholfen :allright:

Verfasst: 18.07.2008 21:00
von marco2007
Aber bitte schreib: gelöst!!

Verfasst: 18.07.2008 21:13
von Kaeru Gaman
*grml* ....also ich finde diese [gelöst] -tags im titel super nervig, wie rickys pop-sofa oder sowas.

PS:
"gelößt" ist natürlich noch schlimmer, der thread ist ja nicht von einem gletscher hergeschliffen worden...

Verfasst: 26.07.2008 23:33
von K.Putt
@ Kaeru Gaman

Das mit den "Gelöst" Tags im Titel finde ich sehr gut, das macht Threads teilweise interessanter.
Ich lese so auch öfters mal Threads die mich sonst nicht speziell interessieren würden.

Verfasst: 27.07.2008 00:08
von onny
oh mist sry, habs geändert ^^