Farbverläufe auf Images
Verfasst: 27.07.2008 00:25
Da ich meine Version eines Farbverlaufs mit 4 Farben gerade nicht
mehr finden kann (PureArea.net, Forensuche), hier nochmal 2 Prozeduren
um Farbverläufe zwischen 2 Farben (Horizontal/Vertikal) und zwischen
4 Farben (4 Ecken) zu machen:
Die Prozedur mit 2 Farben habe ich hier etwas von meiner alten Version im CodeArchiv
abgeändert.
Getestet mit PB/Linux v4.20
mehr finden kann (PureArea.net, Forensuche), hier nochmal 2 Prozeduren
um Farbverläufe zwischen 2 Farben (Horizontal/Vertikal) und zwischen
4 Farben (4 Ecken) zu machen:
Code: Alles auswählen
Procedure DrawGradient(image,color1,color2,type=0)
;
; by Danilo
;
; draw gradient image with 2 colors,
;
; type = #vert (default): draw vertical
; = #horz : draw horizontal
;
#vert = 0
#horz = 1
width = ImageWidth(image)
height = ImageHeight(image)
If type=#vert : i = width : Else : i = height : EndIf
sRed.f = Red(color1) : r.f = (Red (color1) - Red (color2))/i
sGreen.f = Green(color1) : g.f = (Green(color1) - Green(color2))/i
sBlue.f = Blue(color1) : b.f = (Blue (color1) - Blue (color2))/i
If StartDrawing(ImageOutput(image))
For a = 0 To i-1
x.f = sRed - a*r
y.f = sGreen - a*g
z.f = sBlue - a*b
If type=#horz
Line(0,a,width,0,RGB(x,y,z))
Else
Line(a,0,0,height,RGB(x,y,z))
EndIf
Next a
StopDrawing()
EndIf
EndProcedure
Procedure DrawGradient4(image,color1,color2,color3,color4)
;
; by Danilo
;
; draw gradient image with 4 colors,
; 4 colors = 4 corners.
;
; color1/corner1 color2/corner2
; |---------|
; | |
; | |
; | |
; | |
; |---------|
; color3/corner3 color4/corner4
;
width = ImageWidth(image)
height = ImageHeight(image)
;
r_diff1.f = (Red (color1) - Red (color3))/height
g_diff1.f = (Green(Color1) - Green(Color3))/height
b_diff1.f = (Blue (Color1) - Blue (Color3))/height
;
r_diff2.f = (Red (color2) - Red (color4))/height
g_diff2.f = (Green(Color2) - Green(Color4))/height
b_diff2.f = (Blue (Color2) - Blue (Color4))/height
;
If StartDrawing(ImageOutput(image))
For y = 0 To height-1
r_col_start.f = Red(color1) - y*r_diff1
r_col_end.f = Red(color2) - y*r_diff2
g_col_start.f = Green(color1) - y*g_diff1
g_col_end.f = Green(color2) - y*g_diff2
b_col_start.f = Blue(color1) - y*b_diff1
b_col_end.f = Blue(color2) - y*b_diff2
;
r_diff3.f = (r_col_start - r_col_end)/width
g_diff3.f = (g_col_start - g_col_end)/width
b_diff3.f = (b_col_start - b_col_end)/width
For x = 0 To width-1
rcol.f = r_col_start - (x*r_diff3)
gcol.f = g_col_start - (x*g_diff3)
bcol.f = b_col_start - (x*b_diff3)
Plot(x,y,RGB(rcol,gcol,bcol))
Next x
Next y
StopDrawing()
EndIf
EndProcedure
If OpenWindow(0,0,0,620,615,"Gradient",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
img1 = CreateImage(#PB_Any,200,200)
DrawGradient(img1,RGB($EB,$80,$11),RGB($11,$F1,$05),#vert)
ImageGadget(1,5,5,200,200,ImageID(img1))
img2 = CreateImage(#PB_Any,200,200)
DrawGradient(img2,RGB($00,$00,$FF),RGB($00,$FF,$FF),#horz)
ImageGadget(2,210,5,200,200,ImageID(img2))
img3 = CreateImage(#PB_Any,200,200)
DrawGradient4(img3,RGB($FF,$FF,$00),RGB($FF,$FF,$FF),RGB($FF,$00,$00),RGB($00,$00,$00))
ImageGadget(3,415,5,200,200,ImageID(img3))
img4 = CreateImage(#PB_Any,610,400)
DrawGradient4(img4,RGB($FF,$FF,$00),RGB($00,$FF,$FF),RGB($FF,$00,$00),RGB($00,$00,$FF))
ImageGadget(4,5,210,610,400,ImageID(img4))
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
Else
MessageRequester("Error","Can not create gadget list")
EndIf
Else
MessageRequester("Error","Can not open window")
EndIf
abgeändert.
Getestet mit PB/Linux v4.20