Also für beides gibt es in PureBasic keine eingebaute Funktion.
Zur Änderung der Helligkeit würde ich z.B. auf die drei Farbkanäle einfach einen Wert drauf addieren, dann noch den Überlauf (255) abfangen und die neue Farbe zurück geben.
Hier mal ein Beispiel Code dazu. Bitte nicht wundern, dass es im Debugger-Modus ziemlich Ruckelt. Ohne Debugger ist es "recht flink".
Mit dem Schieberegler kannst du die Helligkeit ändern.
Code: Alles auswählen
Enumeration
#Window
#CanvasGadget
#TrackBarGadget
#Image
EndEnumeration
InitNetwork()
UseJPEGImageDecoder()
; Beispiel Bild
Define *Memory = ReceiveHTTPMemory("http://data.unionbytes.de/convergence_by_rahll.jpg")
If *Memory
If CatchImage(#Image, *Memory) = #False
MessageRequester("Failed", "Konnte Bild nicht laden!")
EndIf
Else
MessageRequester("Failed", "Konnte Bild nicht laden!")
EndIf
Global Brightness.i ; Slider-Wert
; Limit-Funktion für Überlaufverhinderung
Procedure.i Limit(Value.i, Min.i, Max.i)
If Value < Min : ProcedureReturn Min
ElseIf Value > Max : ProcedureReturn Max
Else : ProcedureReturn Value
EndIf
EndProcedure
; Filter der Helligkeit
Procedure.l FilterCallback(X.i, Y.i, FrontColor.i, BackColor.i)
Protected R.i = Limit(Red(FrontColor) + Brightness, 0, 255)
Protected G.i = Limit(Green(FrontColor) + Brightness, 0, 255)
Protected B.i = Limit(Blue(FrontColor) + Brightness, 0, 255)
ProcedureReturn RGB(R, G, B)
EndProcedure
; Aktualisierung des Gadgets
Procedure UpdateGadget(Gadget.i)
If StartDrawing(CanvasOutput(Gadget))
DrawingMode(#PB_2DDrawing_CustomFilter)
CustomFilterCallback(@FilterCallback())
DrawImage(ImageID(#Image), 0, 0)
StopDrawing()
EndIf
EndProcedure
OpenWindow(#Window, 0, 0, ImageWidth(#Image), 20+ImageHeight(#Image), "Vector Canvas Gadget", #PB_Window_MaximizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
CanvasGadget(#CanvasGadget, 0, 20, WindowWidth(#Window), WindowHeight(#Window), #PB_Canvas_Keyboard)
UpdateGadget(#CanvasGadget)
TrackBarGadget(#TrackBarGadget, 0, 0, WindowWidth(#Window), 20, 0, 510)
SetGadgetState(#TrackBarGadget, 255)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #TrackBarGadget
Brightness = GetGadgetState(#TrackBarGadget) - 255
UpdateGadget(#CanvasGadget)
EndSelect
EndSelect
ForEver
End
Das Unscharf machen eines Bilds ist nicht so einfach über CustomFilterCallback() zu lösen, da ja auch auf die Nachbarpixel zugegriffen werden muss. Da müsste man das Bild z.B. in einem Array Zwischenspeichern. Auch hier mal ein Beispiel mit ganz einfacher linearer Unschärfe in X-Richtung:
Code: Alles auswählen
Enumeration
#Window
#CanvasGadget
#TrackBarGadget
#Image
EndEnumeration
InitNetwork()
UseJPEGImageDecoder()
; Beispiel Bild
Define *Memory = ReceiveHTTPMemory("http://data.unionbytes.de/convergence_by_rahll.jpg")
If *Memory
If CatchImage(#Image, *Memory) = #False
MessageRequester("Failed", "Konnte Bild nicht laden!")
EndIf
Else
MessageRequester("Failed", "Konnte Bild nicht laden!")
EndIf
Global Blur.i ; Slider-Wert
Global Dim Pixel.i(ImageWidth(#Image)-1, ImageHeight(#Image)-1)
Global Width.i = ImageWidth(#Image)
Global Height.i = ImageHeight(#Image)
; Limit-Funktion für Überlaufverhinderung
Procedure.i Limit(Value.i, Min.i, Max.i)
If Value < Min : ProcedureReturn Min
ElseIf Value > Max : ProcedureReturn Max
Else : ProcedureReturn Value
EndIf
EndProcedure
; Bild zu Array
Procedure.l Callback_ImageToArray(X.i, Y.i, FrontColor.i, BackColor.i)
Pixel(X, Y) = FrontColor
EndProcedure
; Bild in X-Unschärfen
Procedure.l Callback_BlurX(X.i, Y.i, FrontColor.i, BackColor.i)
Protected R.i, G.i, B.i
Protected X0.i = Limit(X-Blur, 0, Width-1)
Protected X1.i = Limit(X+Blur, 0, Width-1)
Protected I.i
For I = X0 To X1
R + Red(Pixel(I, Y)) : G + Green(Pixel(I, Y)) : B + Blue(Pixel(I, Y))
Next
ProcedureReturn RGB(R/(1+X1-X0), G/(1+X1-X0), B/(1+X1-X0))
EndProcedure
; Aktualisierung des Gadgets
Procedure UpdateGadget(Gadget.i)
If StartDrawing(CanvasOutput(Gadget))
DrawingMode(#PB_2DDrawing_CustomFilter)
; Bild ins Array
CustomFilterCallback(@Callback_ImageToArray())
DrawImage(ImageID(#Image), 0, 0)
; Unschärfe
CustomFilterCallback(@Callback_BlurX())
DrawImage(ImageID(#Image), 0, 0)
StopDrawing()
EndIf
EndProcedure
OpenWindow(#Window, 0, 0, ImageWidth(#Image), 20+ImageHeight(#Image), "Vector Canvas Gadget", #PB_Window_MaximizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
CanvasGadget(#CanvasGadget, 0, 20, WindowWidth(#Window), WindowHeight(#Window), #PB_Canvas_Keyboard)
UpdateGadget(#CanvasGadget)
TrackBarGadget(#TrackBarGadget, 0, 0, WindowWidth(#Window), 20, 0, 20)
SetGadgetState(#TrackBarGadget, 0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #TrackBarGadget
Blur = GetGadgetState(#TrackBarGadget)
UpdateGadget(#CanvasGadget)
EndSelect
EndSelect
ForEver
End