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 :roll:
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 :oops:
Mais bon, ça sera pas la dernière :mrgreen:

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 :

Code : Tout sélectionner

Enumeration
    #Vertical
    #Horizontal
EndEnumeration
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 :wink:
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