Seite 1 von 1

Farbverläufe auf Images

Verfasst: 27.07.2008 00:25
von Danilo
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:

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
Die Prozedur mit 2 Farben habe ich hier etwas von meiner alten Version im CodeArchiv
abgeändert.

Getestet mit PB/Linux v4.20