BSOne.SFC/Tocsg.Module/WaterToImage/Tocsg.Watermark.pas

112 lines
3.2 KiB
Plaintext

unit Tocsg.Watermark;
interface
uses
imageen, Vcl.Graphics, Winapi.Windows;
procedure AddWatermarkTextLayer(aImgEn: TImageEn; aFont: TFont; sWaterText: string;
nTransparency: Integer; AAddShadow: Boolean = false);
procedure AddWatermarkImageLayer(aImgEn: TImageEn; sWaterImgPath: string;
nTransparency: Integer; AAddShadow: Boolean = false);
implementation
uses
hyieutils, iexLayers;
procedure AddWatermarkTextLayer(aImgEn: TImageEn; aFont: TFont; sWaterText: string;
nTransparency: Integer; AAddShadow: Boolean = false);
{ Create a watermark layer. }
var
nLayerIdx,
nWInc, nHInc,
nWUntil, nHUntil, i, c: Integer;
r: TRect;
begin
// All layers have the same size
// aImgEn.LayersSync := True;
// Add a new layer
nLayerIdx := aImgEn.LayersAdd;
// Fill the layer with White
aImgEn.Proc.Fill(TColor2TRGB(clWhite));
i := IETextWidthW(aImgEn.Bitmap.Canvas, sWaterText);
// 해상도 크기에 맞춰서 적절히 조절 22_0429 09:04:24 kku
// if aImgEn.Bitmap.Width > 1000 then
// aFont.Size := Round(aImgEn.Bitmap.Width / 80.0)
// else
// aFont.Size := Round(aImgEn.Bitmap.Width / 60.0);
aFont.Size := (aImgEn.Bitmap.Height - IETextWidthW(aImgEn.Bitmap.Canvas, sWaterText)) div 30;
nWInc := Round(aImgEn.Bitmap.Width / 6.0);
nHInc := Round(aImgEn.Bitmap.Height / 2.5);
{ Output our text }
// aImgEn.Proc.TextOut(Align_Text_Horz_Center, Align_Text_Vert_Center,
// AString, AFontName, AFontSize, AFontColor, [fsBold]);
ZeroMemory(@r, SizeOf(r));
r.Left := (aImgEn.Bitmap.Width div 10) * -1;
r.Top := 0;
r.Width := 10000;
r.Height := 10000;
nHUntil := aImgEn.Bitmap.Height;// - (aImgEn.Bitmap.Height div 2);
nWUntil := aImgEn.Bitmap.Width - (aImgEn.Bitmap.Width div 8);
while r.Top < nHUntil do
begin
while r.Left < nWUntil do
begin
aImgEn.Proc.TextOut(r, sWaterText, aFont, -25);
Inc(r.Left, nWInc);
end;
Inc(r.Top, nHInc);
r.Left := 0;
end;
// Make the white background transparent
aImgEn.Proc.SetTransparentColors(TColor2TRGB(clWhite), TColor2TRGB(clWhite), 0);
// Add a shadow
if AAddShadow = true then
aImgEn.Proc.AddSoftShadow(2, 3, 3);
// Set the layers transparency
aImgEn.Layers[nLayerIdx].Transparency := nTransparency;
// 저장을 위해 레이어 합치기 22_0429 08:46:56 kku
aImgEn.LayersMerge(0, 1);
aImgEn.Update;
end;
procedure AddWatermarkImageLayer(aImgEn: TImageEn; sWaterImgPath: string;
nTransparency: Integer; AAddShadow: Boolean = false);
var
nLayerIdx,
nWInc, nHInc,
nWUntil, nHUntil, i, c: Integer;
r: TRect;
begin
nLayerIdx := aImgEn.LayersAdd;
aImgEn.IO.LoadFromFile(sWaterImgPath);
aImgEn.Proc.Resample(aImgEn.Layers[0].Width div 2, aImgEn.Layers[0].Height div 2);
aImgEn.Layers[nLayerIdx].PosX := IELayer_Pos_HCenter;
aImgEn.Layers[nLayerIdx].PosY := IELayer_Pos_VCenter;
// Make the white background transparent
aImgEn.Proc.SetTransparentColors(TColor2TRGB(clWhite), TColor2TRGB(clWhite), 0);
// Add a shadow
if AAddShadow = true then
aImgEn.Proc.AddSoftShadow(2, 3, 3);
// Set the layers transparency
aImgEn.Layers[nLayerIdx].Transparency := nTransparency;
// 저장을 위해 레이어 합치기 22_0429 08:46:56 kku
aImgEn.LayersMerge(0, 1);
aImgEn.Update;
end;
end.