Einzelnen Beitrag anzeigen

krzyk_91

Registriert seit: 12. Mai 2009
13 Beiträge
 
#1

Watermark mit transparantem Text

  Alt 10. Sep 2009, 15:56
Hallo zusmammen, ich möchte ein Programm schreiben, das Watermarks zu meinen Bildern zugibt. Ich habe einen Cod gefunden, der ermöglicht, den transparenten Text zu schreiben:

Delphi-Quellcode:
procedure Tform1.DrawTransparency(Canvas:TCanvas;X,Y:Integer ;Bitmap:TBitmap;Transparency:Byte);
var
Temp:TBitmap;
ByteSrc,ByteDest:^Byte;
TripleSrc,TripleDest:^TRGBTriple;
TransparentColor:TRGBTriple;
H,V:Integer;
begin
Bitmap.PixelFormat:=pf24bit;
Temp:=TBitmap.Create;
Temp.Canvas.Brush.Color :=Bitmap.TransparentColor;
Temp.Width :=Bitmap.Width ;
Temp.Height :=Bitmap.Height ;
Temp.PixelFormat:=pf24bit;
Temp.Canvas.CopyRect(Rect(0,0,Bitmap.Width ,Bitmap.Height ),Canvas,Rect(X,Y,Bitmap.Width+X ,Bitmap.Height+Y ));

if Bitmap.Transparent then
  begin


  TransparentColor.rgbtBlue :=(Bitmap.TransparentColor and $FF0000) shr 16 ;
  TransparentColor.rgbtGreen :=(Bitmap.TransparentColor and $00FF00) shr 8 ;
  TransparentColor.rgbtRed :=Bitmap.TransparentColor and $0000FF;

  Temp.TransparentColor :=Bitmap.TransparentColor;
  Temp.Transparent :=True;

for V:=0 to Bitmap.Height -1 do
  begin
    TripleSrc:=Bitmap.ScanLine[V];
     TripleDest:=Temp.ScanLine[V];
  for H:=0 to Bitmap.Width -1 do
      begin
     if(TransparentColor.rgbtBlue <> TripleSrc.rgbtBlue) or
       ( TransparentColor.rgbtGreen <> TripleSrc.rgbtGreen) or
       (TransparentColor.rgbtRed <> TripleSrc.rgbtRed ) then

          begin
          TripleDest^.rgbtBlue :=Trunc((TripleDest^.rgbtBlue / 100)*Transparency+
          (TripleSrc^.rgbtBlue / 100)*(100-Transparency));

          TripleDest^.rgbtGreen :=Trunc((TripleDest^.rgbtGreen / 100)*Transparency+
          (TripleSrc^.rgbtGreen / 100)*(100-Transparency));

          TripleDest^.rgbtRed :=Trunc((TripleDest^.rgbtRed / 100)*Transparency+
          (TripleSrc^.rgbtRed / 100)*(100-Transparency));
          end;

      inc(TripleSrc);
      inc(TripleDest);
     end ;
  end;
end
   else
begin
for V:=0 to Bitmap.Height -1 do
  begin
    ByteSrc:=Bitmap.ScanLine[V];
    ByteDest:=Temp.ScanLine[V];
  for H:=0 to Bitmap.Width*3 -1 do
    begin
    ByteDest^:=Trunc((ByteDest^ / 100)*Transparency+
    (ByteSrc^ / 100)*(100-Transparency));
    inc(ByteSrc);
    inc(ByteDest);
    end;
  end;
end;
  Canvas.Draw(X,Y,Temp);
  Temp.Free;
end;
und die Prozedur, die DrawTransparency ausruft:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
bmp : TBitmap;
const ZnakWodny ='aaaa';
begin

bmp := TBitmap.Create;
bmp.LoadFromFile('image1.bmp');

bmp.Canvas.Font.Size :=50;

bmp.Canvas.Font.Color:=$00FFFFFE;


bmp.Canvas.Font.Name:='Franklin Gothic Medium';
bmp.Width:= bmp.Canvas.TextWidth(ZnakWodny) ;
bmp.Height:= bmp.Canvas.TextHeight(ZnakWodny) ;
bmp.Canvas.TextOut(0,0,ZnakWodny);

bmp.TransparentColor :=clblack;


bmp.TransparentColor :=Clwhite;

bmp.Transparent := true;

DrawTransparency(image1.Canvas,0,0,bmp,50);


image1.Picture.SaveToFile('image1-watermark.bmp');
bmp.Free;

end;
Der Text ist transparent, aber sieht nicht zu gut aus. Die Kanten jeder Buchstabe ist scharf, sie sieht so aus, weil das Antialising nicht verwendet wurde.

Ich habe den Code von hier http://www.delphipraxis.net/internal...t=antialiasing bentutzt, habe so in Delphi geschrieben:

Delphi-Quellcode:
DrawTransparency(image1.Canvas,0,0,bmp,50);
 Antialiasing2(image1.Canvas,rect(0,0,100,100),40);
Jest ist die Textqualität viel besser, aber die Farbe ist schon nicht so schön weiß und transparent.Lass sich das irgendwie ändern. Ich möchte ein Programm haben, das solche Watermarks bildet, die in z. B. Photoshop zu bekommen sind. Danke im Voraus für Hilfer
  Mit Zitat antworten Zitat