ColorEffex - Module
Posted: Wed Jan 20, 2016 11:10 pm
Hello everyone,
A small module to manipulate color. I deserve credit only to convert the original code into a Module.
Best regards
StarBootics
A small module to manipulate color. I deserve credit only to convert the original code into a Module.
Best regards
StarBootics
Code: Select all
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : ColorEffex - Module
; File Name : ColorEffex - Module.pb
; File version: 2.0.0
; Programming : OK
; Programmed by : Le Soldat Inconnu
; Date : 07-08-2004
; Last Update : 20-01-2016
; PureBasic code : V5.41 LTS
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; This code was originally created by
; Le Soldat Inconnu to manipulate colors.
;
; I deserve credit only to convert the original
; code into a Module.
;
; This code is free to be use where ever you like
; but you use it at your own risk.
;
; The author can in no way be held responsible
; for data loss, damage or other annoying
; situations that may occur.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
DeclareModule ColorEffex
Declare.l Luminosity(Color.l, Scale.f)
Declare.l Contrast(Color.l, Scale.f)
Declare.l Grey(Color.l)
Declare.l Negative(Color.l)
Declare.l RedIntensity(Color.l, Scale.f)
Declare.l GreenIntensity(Color.l, Scale.f)
Declare.l BlueIntensity(Color.l, Scale.f)
Declare.l YellowIntensity(Color, Level.f)
Declare.l CyanIntensity(Color, Level.f)
Declare.l MagentaIntensity(Color, Level.f)
Declare.l Tint(Color.l, Scale.f)
Declare.l Blending(Color1.l, Color2.l, Scale.f)
Declare.l Add(Color1.l, Color2.l)
Declare.l Level(Color, Minimum, Maximum)
EndDeclareModule
Module ColorEffex
Macro ColorLimit(Color, Minimum, Maximum)
If Color > Maximum
Color = Maximum
ElseIf Color < Minimum
Color = Minimum
EndIf
EndMacro
Procedure.l Luminosity(Color.l, Scale.f) ; Eclaicir ou foncer une Couleur
Red.l = (Color & $FF) * Scale
Green.l = (Color >> 8 & $FF) * Scale
Blue.l = (Color >> 16 & $FF) * Scale
ColorLimit(Red, 0, 255)
ColorLimit(Green, 0, 255)
ColorLimit(Blue, 0, 255)
ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
EndProcedure
Procedure.l Contrast(Color.l, Scale.f) ; Contraster la Couleur, échelle négative pour diminuer et positive pour augmenter.
Red.l = (Color & $FF) * Scale + 127 * (1 - Scale)
Green.l = (Color >> 8 & $FF) * Scale + 127 * (1 - Scale)
Blue.l = (Color >> 16 & $FF) * Scale + 127 * (1 - Scale)
ColorLimit(Red, 0, 255)
ColorLimit(Green, 0, 255)
ColorLimit(Blue, 0, 255)
ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
EndProcedure
Procedure.l Grey(Color.l) ; Rendre la Couleur en nuance de gris
Color.l = ((Color & $FF) + (Color >> 8 & $FF) + (Color >> 16 & $FF)) / 3
ProcedureReturn (((Color << 8 + Color) << 8) + Color)
EndProcedure
Procedure.l Negative(Color.l) ; Renvoi la couleur en négatif
Red = 255 - Color & $FF
Green = 255 - Color >> 8 & $FF
Blue = 255 - Color >> 16 & $FF
Alpha = Color >> 24
ProcedureReturn (Red | Green <<8 | Blue << 16 | Alpha << 24)
EndProcedure
Procedure.l RedIntensity(Color.l, Scale.f) ; Eclaicir ou foncer la composante Red d'une Couleur
Red.l = (Color & $FF) * Scale
Green.l = (Color >> 8 & $FF)
Blue.l = (Color >> 16 & $FF)
ColorLimit(Red, 0, 255)
ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
EndProcedure
Procedure.l GreenIntensity(Color.l, Scale.f) ; Eclaicir ou foncer la composante Greene d'une Couleur
Red.l = (Color & $FF)
Green.l = (Color >> 8 & $FF) * Scale
Blue.l = (Color >> 16 & $FF)
ColorLimit(Green, 0, 255)
ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
EndProcedure
Procedure.l BlueIntensity(Color.l, Scale.f) ; Eclaicir ou foncer la composante Blue d'une Couleur
Red.l = (Color & $FF)
Green.l = (Color >> 8 & $FF)
Blue.l = (Color >> 16 & $FF) * Scale
ColorLimit(Blue, 0, 255)
ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
EndProcedure
Procedure.l YellowIntensity(Color, Level.f)
Protected Red, Green
Red = Color & $FF
Green = Color >> 8 & $FF
Red * Level
Green * Level
ColorLimit(Red, 0, 255)
ColorLimit(Green, 0, 255)
ProcedureReturn (Color & $FFFF0000 | Red | Green << 8)
EndProcedure
Procedure.l CyanIntensity(Color, Level.f)
Protected Green, Blue
Green = Color >> 8 & $FF
Blue = Color >> 16 & $FF
Green * Level
Blue * Level
ColorLimit(Green, 0, 255)
ColorLimit(Blue, 0, 255)
ProcedureReturn (Color & $FF0000FF | Green << 8 | Blue << 16)
EndProcedure
Procedure.l MagentaIntensity(Color, Level.f)
Protected Red, Blue
Red = Color & $FF
Blue = Color >> 16 & $FF
Red * Level
Blue * Level
ColorLimit(Red, 0, 255)
ColorLimit(Blue, 0, 255)
ProcedureReturn (Color & $FF00FF00 | Red | Blue << 16)
EndProcedure
Procedure.l Tint(Color.l, Scale.f) ; Changer la teinte d'une Couleur (Scale comprise entre -1 et 1)
Red.l = (Color & $FF)
Green.l = (Color >> 8 & $FF)
Blue.l = (Color >> 16 & $FF)
If Scale > 0
Red = Red * (1 - Scale) + Blue * Scale
Green = Green * (1 - Scale) + Red * Scale
Blue = Blue * (1 - Scale) + Green * Scale
Else
Red = Red * (1 + Scale) - Green * Scale
Green = Green * (1 + Scale) - Blue * Scale
Blue = Blue * (1 + Scale) - Red * Scale
EndIf
ColorLimit(Red, 0, 255)
ColorLimit(Green, 0, 255)
ColorLimit(Blue, 0, 255)
ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
EndProcedure
Procedure.l Blending(Color1.l, Color2.l, Scale.f) ; Mélanger 2 couleurs
Red.l = Color1 & $FF
Green.l = Color1 >> 8 & $FF
Blue.l = Color1 >> 16 & $FF
Red2.l = Color2 & $FF
Green2.l = Color2 >> 8 & $FF
Blue2.l = Color2 >> 16 & $FF
Red = Red * Scale + Red2 * (1 - Scale)
Green = Green * Scale + Green2 * (1 - Scale)
Blue = Blue * Scale + Blue2 * (1 - Scale)
ColorLimit(Red, 0, 255)
ColorLimit(Green, 0, 255)
ColorLimit(Blue, 0, 255)
ProcedureReturn (((Blue << 8 + Green) << 8) + Red)
EndProcedure
Procedure.l Add(Color1.l, Color2.l) ; Ajouter 2 couleurs
Protected Red, Green, Blue, Alpha
Red = Color1 & $FF + Color2 & $FF
Green = Color1 >> 8 & $FF + Color2 >> 8 & $FF
Blue = Color1 >> 16 & $FF + Color2 >> 16 & $FF
Alpha = Color1 >> 24
ColorLimit(Red, 0, 255)
ColorLimit(Green, 0, 255)
ColorLimit(Blue, 0, 255)
ProcedureReturn (Red | Green <<8 | Blue << 16 | Alpha << 24)
EndProcedure
Procedure.l Level(Color, Minimum, Maximum) ; Changer les niveaux de blanc et de noir de la couleur
Protected Red, Green, Blue, Alpha, a.f, b.f
a = 255 / (Maximum - Minimum)
b = -a * Minimum
Red = Color & $FF
Green = Color >> 8 & $FF
Blue = Color >> 16 & $FF
Alpha = Color >> 24
Red * a + b
Green * a + b
Blue * a + b
ColorLimit(Red, 0, 255)
ColorLimit(Green, 0, 255)
ColorLimit(Blue, 0, 255)
ProcedureReturn (Red | Green <<8 | Blue << 16 | Alpha << 24)
EndProcedure
EndModule
CompilerIf #PB_Compiler_IsMainFile
Enumeration
#Frame_Luminosity
#Frame_Contrast
#Frame_Grey
#Frame_RedIntensity
#Frame_GreenIntensity
#Frame_BlueIntensity
#Frame_Tint
#Frame_Blending
#Frame_Add
EndEnumeration
Macro GadgetDown(GadgetID, Gap = 0)
(GadgetY(GadgetID) + GadgetHeight(GadgetID) + (Gap))
EndMacro
If OpenWindow(0, 0, 0, 320, 600, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
;- Eclaicir et foncer une couleur
FrameGadget(#Frame_Luminosity, 5, 5, 310, 55, "Color Luminosity", #PB_Text_Center)
Couleur = RGB(40, 177, 40) ; Couleur de base
Image = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
StartDrawing(ImageOutput(Image))
Box(0, 0, 100, 25, Couleur)
Box(100, 0, 100, 25, ColorEffex::Luminosity(Couleur, 1.2)) ; On eclaircie la couleur
Box(200, 0, 100, 25, ColorEffex::Luminosity(Couleur, 0.8)) ; On fonce la couleur
; ColorLuminosity(Couleur, Echelle)
; Echelle = 0 à infini
; 0 donne une couleur noire
; 1 donne la même couleur
; inifini donne du blanc
DrawingMode(1)
FrontColor(0)
DrawText(105, 2, "thinning")
DrawText(205, 2, "darkened")
StopDrawing()
ImageGadget(#PB_Any, 10, 30, 300, 25, ImageID(Image)) ; On affiche l'image
;- Changer le contraste d'une couleur
FrameGadget(#Frame_Contrast, 5, GadgetDown(#Frame_Luminosity, 5), 310, 55, "Color Contrast", #PB_Text_Center)
Couleur = RGB(144, 153, 255) ; Couleur de base
Image2 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
StartDrawing(ImageOutput(Image2))
Box(0, 0, 100, 25, Couleur)
Box(100, 0, 100, 25, ColorEffex::Contrast(Couleur, 2)) ; On augmente le contraste de la couleur
Box(200, 0, 100, 25, ColorEffex::Contrast(Couleur, 0.3)) ; On diminue le contraste de la couleur
; ColorContrast(Couleur, Echelle)
; Echelle = 0 à infini
; 0 donne une couleur grise RGB(127, 127, 127) (contraste minimum)
; 1 donne la même couleur
; inifini donne le contraste maximum
DrawingMode(1)
FrontColor(0)
DrawText(105, 2, "Increased")
DrawText(205, 2, "Decreased")
StopDrawing()
ImageGadget(#PB_Any, 10, 90, 300, 25, ImageID(Image2)) ; On affiche l'image
FrameGadget(#Frame_Grey, 5, GadgetDown(#Frame_Contrast, 5), 310, 55, "Color into shade of grey")
Couleur = RGB(100, 200, 255) ; Couleur de base
Image3 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
StartDrawing(ImageOutput(Image3))
Box(0, 0, 100, 25, Couleur)
Box(100, 0, 200, 25, ColorEffex::Grey(Couleur)) ; On transforme la couleur en nuance de gris
DrawingMode(1)
FrontColor(0)
DrawText(105, 2, "Shade of grey")
StopDrawing()
ImageGadget(#PB_Any, 10, 150, 50, 25, ImageID(Image3)) ; On affiche l'image
;- Changer l'intensité de la composante Red d'une couleur
FrameGadget(#Frame_RedIntensity,5, GadgetDown(#Frame_Grey, 5), 310, 55, "Change red component")
Couleur = RGB(170, 153, 255) ; Couleur de base
Image4 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
StartDrawing(ImageOutput(Image4))
Box(0, 0, 100, 25, Couleur)
Box(100, 0, 100, 25, ColorEffex::RedIntensity(Couleur, 1.5)) ; On augmente l'intensité de la composante Red
Box(200, 0, 100, 25, ColorEffex::RedIntensity(Couleur, 0.7)) ; On diminue l'intensité de la composante Red
; ColorRedIntensity(Couleur, Echelle)
; Echelle = 0 à infini
; 0 donne la composante Red égale à 0
; 1 donne la même couleur
; inifini donne la composante Red égale à 255
DrawingMode(1)
FrontColor(0)
DrawText(105, 2, "Increased")
DrawText(205, 2, "Decreased")
StopDrawing()
ImageGadget(#PB_Any, 10, 210, 50, 25, ImageID(Image4)) ; On affiche l'image
;
;- Changer l'intensité de la composante Greene d'une couleur
FrameGadget(#Frame_GreenIntensity, 5, GadgetDown(#Frame_RedIntensity, 5), 310, 55, "Change green component")
Couleur = RGB(170, 153, 200) ; Couleur de base
Image5 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
StartDrawing(ImageOutput(Image5))
Box(0, 0, 100, 25, Couleur)
Box(100, 0, 100, 25, ColorEffex::GreenIntensity(Couleur, 1.5)) ; On augmente l'intensité de la composante Greene
Box(200, 0, 100, 25, ColorEffex::GreenIntensity(Couleur, 0.7)) ; On diminue l'intensité de la composante Greene
; ColorGreenIntensity(Couleur, Echelle)
; Echelle = 0 à infini
; 0 donne la composante Greene égale à 0
; 1 donne la même couleur
; inifini donne la composante Greene égale à 255
DrawingMode(1)
FrontColor(0)
DrawText(105, 2, "Increased")
DrawText(205, 2, "Decreased")
StopDrawing()
ImageGadget(#PB_Any, 10, 270, 50, 25, ImageID(Image5)) ; On affiche l'image
;- Changer l'intensité de la composante Blue d'une couleur
FrameGadget(#Frame_BlueIntensity, 5, GadgetDown(#Frame_GreenIntensity, 5), 310, 55, "Change Blue component")
Couleur = RGB(170, 153, 150) ; Couleur de base
Image6 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
StartDrawing(ImageOutput(Image6))
Box(0, 0, 100, 25, Couleur)
Box(100, 0, 100, 25, ColorEffex::BlueIntensity(Couleur, 1.5)) ; On augmente l'intensité de la composante Blue
Box(200, 0, 100, 25, ColorEffex::BlueIntensity(Couleur, 0.7)) ; On diminue l'intensité de la composante Blue
; ColorBlueIntensity(Couleur, Echelle)
; Echelle = 0 à infini
; 0 donne la composante Blue égale à 0
; 1 donne la même couleur
; inifini donne la composante Blue égale à 255
DrawingMode(1)
FrontColor(0)
DrawText(105, 2, "Increased")
DrawText(205, 2, "Decreased")
StopDrawing()
ImageGadget(#PB_Any, 10, 330, 50, 25, ImageID(Image6)) ; On affiche l'image
;- Changer la teinte d'une couleur
FrameGadget(#Frame_Tint, 5, GadgetDown(#Frame_BlueIntensity, 5), 310, 55, "Change color tint")
Couleur = RGB(120, 255, 80) ; Couleur de base
Image7 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
StartDrawing(ImageOutput(Image7))
Box(0, 0, 100, 25, Couleur)
Box(100, 0, 100, 25, ColorEffex::Tint(Couleur, 0.2)) ; On augmente la teinte de la couleur
Box(200, 0, 100, 25, ColorEffex::Tint(Couleur, -0.2)); On diminue la teinte de la couleur
; ColorTint(Couleur, Echelle)
; Echelle = -1 à 1
; -1 donne la couleur RGB(Blue(Couleur), Red(Couleur), Green(Couleur))
; 0 donne la même couleur
; 1 donne la couleur RGB(Green(Couleur), Blue(Couleur), Red(Couleur))
DrawingMode(1)
FrontColor(0)
DrawText(105, 2, "Increased")
DrawText(205, 2, "Decreased")
StopDrawing()
ImageGadget(#PB_Any, 10, 390, 50, 25, ImageID(Image7)) ; On affiche l'image
FrameGadget(#Frame_Blending, 5, GadgetDown(#Frame_Tint, 5), 310, 55, "Colors Blending")
Couleur1 = RGB(255, 0, 0) ; Couleur de base 1
Couleur2 = RGB(0, 255, 0) ; Couleur de base 2
Image8 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
StartDrawing(ImageOutput(Image8))
Box(0, 0, 100, 25, Couleur1)
Box(100, 0, 100, 25, Couleur2) ; On augmente la teinte de la couleur
Box(200, 0, 100, 25, ColorEffex::Blending(Couleur1, Couleur2, 0.5)) ; On mélange les couleurs
; ColorBlending(Couleur1.l, Couleur2.l, Echelle.f)
; Echelle = 0 à 1
; L'échelle représentage le pourcentage de la couleur 1 dans le mélange
DrawingMode(1)
FrontColor(0)
DrawText(5, 2, "Color #1")
DrawText(105, 2, "Color #2")
DrawText(205, 2, "Blend")
StopDrawing()
ImageGadget(#PB_Any, 10, 450, 50, 25, ImageID(Image8)) ; On affiche l'image
FrameGadget(#Frame_Add, 5, GadgetDown(#Frame_Blending, 5), 310, 55, "Colors Adding")
Couleur1 = RGB(255, 0, 0) ; Couleur de base 1
Couleur2 = RGB(0, 255, 0) ; Couleur de base 2
Image9 = CreateImage(#PB_Any, 300, 25) ; création de l'image avec la couleur de base et les couleurs modifiés
StartDrawing(ImageOutput(Image9))
Box(0, 0, 100, 25, Couleur1)
Box(100, 0, 100, 25, Couleur2) ; On augmente la teinte de la couleur
Box(200, 0, 100, 25, ColorEffex::Add(Couleur1, Couleur2)) ; On ajoute les couleurs
DrawingMode(1)
FrontColor(0)
DrawText(5, 2, "Color #1")
DrawText(105, 2, "Color #2")
DrawText(205, 2, "Added")
StopDrawing()
ImageGadget(#PB_Any, 10, 510, 50, 25, ImageID(Image9)) ; On affiche l'image
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
CompilerEndIf
; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<