Png au dessus d'une png avec alphascanline (scanline)

cs_AgentAmine Messages postés 28 Date d'inscription mercredi 24 juin 2009 Statut Membre Dernière intervention 11 avril 2012 - 27 août 2011 à 02:01
cs_AgentAmine Messages postés 28 Date d'inscription mercredi 24 juin 2009 Statut Membre Dernière intervention 11 avril 2012 - 27 août 2011 à 18:30
Salut,

J'ai cree une procedure pour dessiner une image PNG sur une autre, mais le resultat est mauvais :



C'est la 1ere image "Png" :


C'est la 2eme image "OverPng" :


c'est le résultat souhaité : (avec photoshop)


et c'est la mauvaise image : (avec mon code)



Ma Procedure :

function CombineAlphas(Source, Overlay: Byte): Byte;
begin
  Result := Source + (255 - Source) * Overlay div 255;
end;

procedure DrawPng(var Png:TPngImage; OverPng:TPngImage; X,Y,W,H:Integer);
var P1,P2       : PByteArray;
    I,J         : Integer;
begin
  for J := 0 to Png.Height-1 do
  begin
    P1 := Png.AlphaScanline[J];
    P2 := OverPng.AlphaScanline[J-Y];
    for I := 0 to Png.Width-1 do
    Begin
      if (I >= X) and (I < OverPng.Width+X) and (J >= Y) and (J < OverPng.Height+Y)
      then  P1[I] := CombineAlphas(P1[I],P2[I-X]);
    End;
  end;
  Png.Canvas.Draw(X,Y,OverPng);
end;



aide SVP
AgentAmine;

2 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 août 2011 à 14:45
Salut,

pourquoi tu cherches à compliquer la chose ?

1°) Méthode sans code:
 - tu déposes deux TImage superposés,
   tu charges les images et c'est tout

2°) Méthode avec code:
implementation

{$R *.dfm}
var
  Png1, Png2 : TPNGImage;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Png1 := TPNGImage.Create;
  Png1.LoadFromFile('121401trash.png');   //128 X 128

  Png2 := TPNGImage.Create;
  Png2.LoadFromFile('327017bar.png');     //256 X 256
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Png1.Free;
  Png2.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    Png1.Draw(Canvas, Rect(272, 8, 400, 136));   //128 X 128
    Png2.Draw(Canvas, Rect(272, 8, 528, 264));   //256 X 256
end;



[hr]@+Cirec
[hr]
0
cs_AgentAmine Messages postés 28 Date d'inscription mercredi 24 juin 2009 Statut Membre Dernière intervention 11 avril 2012
27 août 2011 à 18:30
Cirec, c'est genial, merci
mais comment sauvegarder cette canvas sous un fichier PNG ?? :

 
procedure TForm1.Button1Click(Sender: TObject);
var P:tpngimage;
begin
    P := tpngimage.CreateBlank(Color_rgbalpha,8,Png2.Width,Png2.Height);
    Png1.Draw(P.Canvas, Rect(0, 0, 128, 128));   //128 X 128
    Png2.Draw(P.Canvas, Rect(0, 0, 256, 256));   //256 X 256
    P.SaveToFile('c:\test.png');
    P.Free;
end;
(ca marche pas ce code, toute l'image est noire, car elle est completement transparente)

merci d'avance
0
Rejoignez-nous