Les Snippets

Connexion

Combinaison de deux couleurs (AlphaBlend)

Niveau requis pour utiliser/comprendre cette source : 1 ( Débutant )
Créé le 24/09/2006 15:15:55 et initié par EBArtSoft [Liste]
Date de mise à jour : 25/10/2007 17:10:08
Vue : 7338
Catégorie(s) : Trucs & Astuces, Algorithme, Graphique
Langages dispo pour ce code :
- VB6, VBA
- Delphi 5



Langage : VB6 , VBA
Date ajout : 24/09/2006
Posté par EBArtSoft [Liste]

Private Type RGBAL
    a As Long
End Type

Private Type RGBAB
    r As Byte
    g As Byte
    b As Byte
    a As Byte
End Type

Function BlendColor(ByVal Src0 As Long, ByVal Src1 As Long, ByVal Alpha As Byte) As Long
    Dim v0 As Single
    Dim v1 As Single
    Dim p0 As RGBAB
    Dim p1 As RGBAB
    Dim t0 As RGBAL
    Dim t1 As RGBAL
    
    t0.a = Src0
    t1.a = Src1
    
    LSet p0 = t0
    LSet p1 = t1
    
    v0 = Alpha / 255
    v1 = 1 - v0
    
    p0.r = p0.r * v0 + p1.r * v1
    p0.g = p0.g * v0 + p1.g * v1
    p0.b = p0.b * v0 + p1.b * v1

    LSet t0 = p0
    BlendColor = t0.a
End Function


Remarque :
Debug.Print BlendColor(&hFF00FF,&hFFFFFF,128)
Langage : Delphi 5
Date ajout : 06/02/2007
Posté par f0xi [Liste]
DateMAJ : 25/10/2007
function AlphaBlendProcess(const ColorA, ColorB: integer; const Alpha: single = 1 {1= 100%, 0.5= 50%}): integer;
var NAlpha : single;
    CA : array[0..3] of byte Absolute ColorA;
    CB : array[0..3] of byte Absolute ColorB;
    CR : array[0..3] of byte Absolute result;
begin
  NAlpha := 1 - alpha;
  CR[0]  := byte( round( (CA[0]*Alpha) + (CB[0]*NAlpha) ) );
  CR[1]  := byte( round( (CA[1]*Alpha) + (CB[1]*NAlpha) ) );
  CR[2]  := byte( round( (CA[2]*Alpha) + (CB[2]*NAlpha) ) );
  CR[3]  := 0;
end;
{ exemple :
  C := AlphaBlendProcess($54749C, $FFFFCC, 0.5); { C = $00AABAB4 }
}


{ version avec precalcul (+ performances / gain =~ 50%) }
type
  TAlphaTable = array[byte, byte] of byte;

procedure PreCalcAlphaTable(var AlphaTable: TAlphaTable; const Alpha: single= 1 {1= 100%, 0.5= 50%});
var A,B: integer;
    NAlpha: single;
begin
  NAlpha := 1 - Alpha;
  for A := 0 to 255 do
    for B := 0 to 255 do
      AlphaTable[A,B] := byte( round( (A*Alpha) + (B*NAlpha) ) );
end;

function AlphaBlendProcess(const ColorA, ColorB: integer; const AlphaTable: TAlphaTable): integer;
var
  CA : array[0..3] of byte Absolute ColorA;
  CB : array[0..3] of byte Absolute ColorB;
  CR : array[0..3] of byte Absolute result;
begin
  CR[0]  := AlphaTable[CA[0], CB[0]];
  CR[1]  := AlphaTable[CA[1], CB[1]];
  CR[2]  := AlphaTable[CA[2], CB[2]];
  CR[3]  := 0;
end;
{ exemple :
  PreCalcAlphaTable(AlphaTable, 0.5);
  for Y := 0 to MaxY do
    for X := 0 to MaxX do
      ColorPixelR[X,Y] := AlphaBlendProcess(ColorPixelA[X,Y], ColorPixelB[X,Y], AlphaTable); 
}


Snippets en rapport avec : Couleur, Transparence, Alpha, Combinaison, Blend



Codes sources en rapport avec : Couleur, Transparence, Alpha, Combinaison, Blend

{Delphi} BITMAP 32BITS INTÉGRÉ À LA VCL (TIMAGE, TPICTURE, TBITMAP, TOPENPICTUREDIALOG)
ça fait longtemps que j'ai ce code sous le coude (déjà plusieurs refontes) et j'ai pensé qu'il était...

{Visual Basic, VB6, VB.NET, VB 2005} FORMS SKINNABLES STYLE WIDGET (VB2005)
Fenêtre skinnable en Visual Basic 2005. Permet l'affichage de Fenêtres à partir de fichiers png, ...

{C / C++ / C++.NET} SKINNED MESH
hi ho, Un skinned mesh, le code source du SDK rebidouillé version plus simpliste. Pour ceux qui on...

{Visual Basic, VB6, VB.NET, VB 2005} FORM GRAPHIQUE AUX BORDURES IRREGULIERES STYLE WIDGET
Bonjour, Voici une class qui pourra sûrement en aider plus d'un. C'est une partie du code du l...

{Delphi} TREEVIEW AVEC ALPHABLENDING
Salut, voici un bout de temps que je cherchais un composant TreeView proposant un effet d'alphablend...

{Delphi} CHANGEMENT DE LA COULEUR D UN PIXEL+COULEURS PROCHES ... (NOUVELLE VERSION )
Le titre annonce la couleur ... En gros vous selectionnez la couleur que vous voulez remplacer d...

{Visual Basic, VB6, VB.NET, VB 2005} OPACITÉ D'UNE FENETRE: LA RENDRE TRANSPARENTE
Ce code n'est pas une révolution, il permet juste de changer l'opacité d'une fenetre (comme par exem...

{Delphi} COMBINAISONS DE STRINGS
Bonjour ! Ce code permet à partir d'une base, de faire des combinaisons de strings. Je cherche à...

{Delphi} RÉGLE TRANSPARENTE POUR MESURER UN OBJET ECRAN
J'ai trouvé sur un site de téléchargement une application qui permet de mesurer des objets sur l'é...

{PHP} PHP COLORSYS
Cet objet rassemble quelques outils pour jouer avec les couleurs. J'en avais besoin pour choper le H...