Page 1 sur 8
Librairie Effect
Publié : ven. 06/août/2004 13:47
par Le Soldat Inconnu
Une petite lib pour faire des transformation sur les couleurs.
Les effets disponibles sont les suivants :
- Eclaicir et foncer une couleur (Changer la luminosité)
- Augmenter ou diminure le contraste d'une couleur
- Transformer la couleur en nuance de gris
- Changer l'intensité de la composante rouge, verte ou bleu d'une couleur
- Changer la teinte d'une couleur
vous la trouverez sur mon site
http://perso.wanadoo.fr/lesoldatinconnu/
Publié : ven. 06/août/2004 14:50
par Anonyme2
Tu pourrais indiquer les limites des paramètres
ColorLuminosity
ColorContrast
ColorRedIntensity
ColorGreenIntensity
ColorBlueIntensity
ColorTint
Pour ColorGrey, tu pourrais aussi passer un 2eme paramètre qui serait la référence de gris vers lesquelles la couleur devrait tendre (ce qui permettrait de faire varier le rendu des gris) et donc de la couleur RVB finale.
Publié : ven. 06/août/2004 14:53
par Le Soldat Inconnu
Pour ColorGrey, tu pourrais aussi passer un 2eme paramètre qui serait la référence de gris vers lesquelles la couleur devrait tendre (ce qui permettrait de faire varier le rendu des gris) et donc de la couleur RVB finale.
pas saisi
tu peux combiner avec ColorLuminosity si c'est ça que tu cherches
sinon, j'ai rajouté les limites des variables d'échelle de chaque fonction dans l'exemple
voici le code de la lib pour ceux que ça intéresse
Code : Tout sélectionner
ProcedureDLL.l ColorLuminosity(Couleur, Echelle.f) ; Eclaicir ou foncer une couleur
Protected Rouge, Vert, Bleu
Rouge = Red(Couleur) * Echelle
Vert = Green(Couleur) * Echelle
Bleu = Blue(Couleur) * Echelle
If Rouge > 255 : Rouge = 255 : EndIf
If Vert > 255 : Vert = 255 : EndIf
If Bleu > 255 : Bleu = 255 : EndIf
ProcedureReturn RGB(Rouge, Vert, Bleu)
EndProcedure
ProcedureDLL.l ColorContrast(Couleur, Echelle.f) ; Constrater la couleur, échelle négative pour diminuer et positive pour augmenter.
Protected Rouge, Vert, Bleu
Rouge = Int(Red(Couleur) * Echelle + 127 * (1 - Echelle))
Vert = Int(Green(Couleur) * Echelle + 127 * (1 - Echelle))
Bleu = Int(Blue(Couleur) * Echelle + 127 * (1 - Echelle))
If Rouge > 255 : Rouge = 255
ElseIf Rouge < 0 : Rouge = 0 : EndIf
If Vert > 255 : Vert = 255
ElseIf Vert < 0 : Vert = 0 : EndIf
If Bleu > 255 : Bleu = 255
ElseIf Bleu < 0 : Bleu = 0 : EndIf
ProcedureReturn RGB(Rouge, Vert, Bleu)
EndProcedure
ProcedureDLL.l ColorGrey(Couleur.l) ; Rendre la couleur en nuance de gris
Couleur = (Red(Couleur) + Green(Couleur) + Blue(Couleur)) / 3
ProcedureReturn RGB(Couleur, Couleur, Couleur)
EndProcedure
ProcedureDLL.l ColorRedIntensity(Couleur, Echelle.f) ; Eclaicir ou foncer la composante rouge d'une couleur
Protected Rouge, Vert, Bleu
Rouge = Red(Couleur) * Echelle
Vert = Green(Couleur)
Bleu = Blue(Couleur)
If Rouge > 255 : Rouge = 255 : EndIf
ProcedureReturn RGB(Rouge, Vert, Bleu)
EndProcedure
ProcedureDLL.l ColorGreenIntensity(Couleur, Echelle.f) ; Eclaicir ou foncer la composante verte d'une couleur
Protected Rouge, Vert, Bleu
Rouge = Red(Couleur)
Vert = Green(Couleur) * Echelle
Bleu = Blue(Couleur)
If Vert > 255 : Vert = 255 : EndIf
ProcedureReturn RGB(Rouge, Vert, Bleu)
EndProcedure
ProcedureDLL.l ColorBlueIntensity(Couleur, Echelle.f) ; Eclaicir ou foncer la composante bleu d'une couleur
Protected Rouge, Vert, Bleu
Rouge = Red(Couleur)
Vert = Green(Couleur)
Bleu = Blue(Couleur) * Echelle
If Bleu > 255 : Bleu = 255 : EndIf
ProcedureReturn RGB(Rouge, Vert, Bleu)
EndProcedure
ProcedureDLL.l ColorTint(Couleur, Echelle.f) ; Changer la teinte d'une couleur (Echelle comprise entre -1 et 1)
Protected Rouge, Vert, Bleu
Rouge = Red(Couleur)
Vert = Green(Couleur)
Bleu = Blue(Couleur)
If Echelle > 0
Rouge = Rouge * (1 - Echelle) + Bleu * Echelle
Vert = Vert * (1 - Echelle) + Rouge * Echelle
Bleu = Bleu * (1 - Echelle) + Vert * Echelle
Else
Rouge = Rouge * (1 + Echelle) - Vert * Echelle
Vert = Vert * (1 + Echelle) - Bleu * Echelle
Bleu = Bleu * (1 + Echelle) - Rouge * Echelle
EndIf
ProcedureReturn RGB(Rouge, Vert, Bleu)
EndProcedure
Publié : ven. 06/août/2004 15:01
par Anonyme2
Je viens de faire des essais avec colorgrey
La nuance de gris varie en fonction de la couleur de base et ca ne donne rien avec le noir ou le blanc.
Donc sur ce point, j'ai dit une connerie
Mais bon, ça sera pas la dernière

Publié : ven. 06/août/2004 15:03
par Le Soldat Inconnu
A la base, ColorGrey est pour transformer une image en couleur en image en nuance de gris par exemple
Publié : dim. 08/août/2004 14:14
par Le Soldat Inconnu
Bon, j'ai ajouté de nouveau effet et fait une correction sur ColorTint
j'ai également ajouté un exemple d'étideur d'image qui permet d'essayer chaque effet de la lib sur une image. c'est plus parlant.
c'est ici : (7 ko)
http://perso.wanadoo.fr/lesoldatinconnu ... Effect.zip
Publié : sam. 04/sept./2004 15:16
par Flype
n'est il pas possible d'intégrer les fonctions de dégradé (voir le post sur le prog de defrag) dans ta lib, regis ?
Publié : sam. 04/sept./2004 18:13
par Guimauve
Pour une fonction de dégradé :
Code : Tout sélectionner
ProcedureDLL DrawGradient(Color1.l, Color2.l, NbColor.l, largeur.l, hauteur.l, OutputID.l, Orientation.b)
rt = Red(Color1)
rd = Red(Color2) - rt
gt = Green(Color1)
gd = Green(Color2) - gt
bt = Blue(Color1)
bd = Blue(Color2) - bt
StartDrawing(OutputID)
If Orientation = #Vertical
While i < NbColor
r = MulDiv_(i, rd, NbColor) + rt
g = MulDiv_(i, gd, NbColor) + gt
b = MulDiv_(i, bd, NbColor) + bt
y = MulDiv_(i, hauteur, Nbcolor)
h = MulDiv_(i + 2, hauteur, NbColor)
Box( 0, y, largeur, h, RGB(r, g, b))
i + 1
Wend
ElseIf Orientation = #Horizontal
While i < NbColor
r = MulDiv_(i, rd, NbColor) + rt
g = MulDiv_(i, gd, NbColor) + gt
b = MulDiv_(i, bd, NbColor) + bt
x = MulDiv_(i, largeur, Nbcolor)
l = MulDiv_(i + 2, largeur, NbColor)
Box(x, 0, l, hauteur, RGB(r, g, b))
i + 1
Wend
EndIf
StopDrawing()
EndProcedure
Et dans un résident :
A+
Guimauve
Publié : sam. 04/sept./2004 23:01
par Flype
c'est pas la meme routine que regis, çà
elle marche nickel, a toi de jouer regis
Publié : dim. 05/sept./2004 2:41
par Guimauve
Je sais plus où je l'ai reprise. Mais je pense qu'elle vient de CodeArchive. Mais je suis pas sûr. Faudrait peut-être que je prenne l'habitude de le noter en commentaire dans le début du source.
Il y a ces deux autres procédures pour les images :
Faire un renversement de l'image. Voir sur code archive
Charger un image avec une transparence. Un code de Danilo (Merçi)
N.B. MirrorImage() s'effectue sur l'image en cours. Donc un UseImage(),Createimage(), ou un LoadImage() juste avant l'appel de cette procédure pour que la transformation fonctionne. Les mêmes Constantes que pour la fonction de dégradé : #Vertical et #Horizontal.
A+
Guimauve
Code : Tout sélectionner
ProcedureDLL MirrorImage(Orientation.b)
Width.l = ImageWidth()
Height.l = ImageHeight()
If Orientation = #Vertical
hDC = StartDrawing(ImageOutput())
StretchBlt_(hDC, 0, Height, Width, -Height, hDC, 0, 0, Width, Height, #SRCCOPY)
StopDrawing()
ElseIf Orientation = #Horizontal
hDC = StartDrawing(ImageOutput())
StretchBlt_(hDC, Width, 0, -Width, Height, hDC, 0, 0, Width, Height, #SRCCOPY)
StopDrawing()
EndIf
EndProcedure
ProcedureDLL LoadTransparentImage(Number, FileName$, TransColor, NewColor)
; >
; > Number = ImageNumber
; > FileName$ = File Name
; > TransColor = RGB: Transparent Color, -1 = First Color in Picture
; > NewColor = RGB: New Color for TransColor, -1 = System Window Background
; >
Structure _LTI_BITMAPINFO
bmiHeader.BITMAPINFOHEADER
bmiColors.RGBQUAD[1]
EndStructure
Structure _LTI_LONG
l.l
EndStructure
hBmp = LoadImage(Number, FileName$)
If hBmp
hDC = StartDrawing(ImageOutput())
If hDC
ImageWidth = ImageWidth()
ImageHeight = ImageHeight()
mem = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, ImageWidth * ImageHeight * 4)
If mem
bmi._LTI_BITMAPINFO
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiheader\biWidth = ImageWidth
bmi\bmiheader\biHeight = ImageHeight
bmi\bmiheader\biPlanes = 1
bmi\bmiheader\biBitCount = 32
bmi\bmiheader\biCompression = #BI_RGB
If GetDIBits_(hDC, hBmp, 0, ImageHeight(), mem, bmi, #DIB_RGB_COLORS) <> 0
If TransColor = -1
*pixels._LTI_LONG = mem + ((ImageHeight - 1) * ImageWidth * 4)
TransColor = *pixels\l
Else
TransColor = RGB(Blue(TransColor), Green(TransColor), Red(TransColor))
EndIf
If NewColor = -1
NewColor = GetSysColor_(#COLOR_3DFACE)
EndIf
NewColor = RGB(Blue(NewColor), Green(NewColor), Red(NewColor))
*pixels._LTI_LONG = mem
For a = 1 To ImageWidth * ImageHeight
If * pixels\l = TransColor
*pixels\l = NewColor
EndIf
*pixels + 4
Next a
If SetDIBits_(hDC, hBmp, 0, ImageHeight(), mem, bmi, #DIB_RGB_COLORS) <> 0
Result = hBmp
EndIf
EndIf
GlobalFree_(mem)
EndIf
EndIf
StopDrawing()
EndIf
ProcedureReturn Result
EndProcedure
Publié : lun. 06/sept./2004 15:07
par Le Soldat Inconnu
si j'ajoute des transformations sur les images dans ma lib, genre rotation à droite ou a gauche, symétrie, négatif
ça intéresserait du monde ou pas ?
Publié : mar. 07/sept./2004 6:01
par Guimauve
Bien moi j'ai mis une procédure de "symétrie" MirrorImage() dans le code précédent. J'en ai eu besoin dans un de mes programmes. Pour la rotation, et je n'ai pas pris le temps de coder une procédure pour faire ça.
Oui je trouve que ça pourrait être intéressant.
A+
Guimauve
Publié : mar. 07/sept./2004 18:59
par Flype
moi oui regis
ceci dit peut etre rentrerais tu en "concurrence" avec d'autres userlib existentes faite en ASM
il me semble bien qu'il en existe... je v voir...
vu sur purearea.net :
lib "effects"
http://www.purearea.net/pb/download/use ... ffects.zip
lib "rotation"
http://www.purearea.net/pb/download/use ... ations.zip
lib "X2D"
http://www.purearea.net/pb/download/userlibs/X2D.zip
essaye et juge par toi meme
ta lib resterais cohérente en y rajoutant du traitement d'images
Publié : mar. 07/sept./2004 22:16
par Le Soldat Inconnu
question bête, en asm ou avec PB, ça change quoi vu que PB compile en ASM
Publié : mar. 07/sept./2004 22:31
par Flype
ca change presque rien...
juste une question d'optimisation du code assembleur.
et donc de la rapidité et/ou de la taille de l'exe