Farbverläufe auf Images

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Farbverläufe auf Images

Beitrag 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
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck