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.