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