unit DWater2ImgMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, hyieutils, Vcl.Graphics, iexBitmaps, hyiedefs, iesettings, iexLayers, iexRulers, ieview, imageenview, imageen, Vcl.StdCtrls, Vcl.ExtCtrls; Const PixelMax = 32768; Type pPixelArray = ^TPixelArray; TPixelArray = Array[0..PixelMax-1] Of TRGBTriple; type TDlgWater2ImgMain = class(TForm) edPath: TEdit; btnLoad: TButton; ImageEn: TImageEn; edWater: TEdit; btnWrite: TButton; btnWater: TButton; btnWaterGDIP: TButton; Button1: TButton; Image1: TImage; procedure btnLoadClick(Sender: TObject); procedure btnWriteClick(Sender: TObject); procedure btnWaterClick(Sender: TObject); procedure btnWaterGDIPClick(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } Font_: TFont; public { Public declarations } Constructor Create(aOwner: TComponent); override; Destructor Destroy; override; end; var DlgWater2ImgMain: TDlgWater2ImgMain; implementation uses Tocsg.Watermark, Tocsg.Safe, Vcl.Imaging.jpeg, Tocsg.Graphic, Vcl.Imaging.pngimage, Winapi.GDIPOBJ, System.UIConsts, Winapi.GDIPAPI, Winapi.ActiveX; {$R *.dfm} Constructor TDlgWater2ImgMain.Create(aOwner: TComponent); begin Inherited Create(aOwner); Font_ := TFont.Create; Font_.Size := 13; Font_.Name := 'Arial'; Font_.Style := Font_.Style + [fsBold]; end; Destructor TDlgWater2ImgMain.Destroy; begin FreeAndNil(Font_); Inherited; end; procedure TDlgWater2ImgMain.btnLoadClick(Sender: TObject); const cTrMatrix: TColorMatrix = ( (1.0, 0.0, 0.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0, 0.0), (0.0, 0.0, 1.0, 0.0, 0.0), (0.0, 0.0, 0.0, 0.5, 0.0), (0.0, 0.0, 0.0, 0.0, 1.0)); var bmp, bmpImg, bmpWater, bmpWater2: TBitmap; sText, sOut, sTxtPath: String; jpg: TJPEGImage; nW, nH, nX, nY: Integer; StrList: TStringList; i: Integer; begin Guard(jpg, TJPEGImage.Create); jpg.LoadFromFile('C:\taskToCSG\eCrmHE\Modules\HEC\HWMJ.dat'); sText := 'kjkim/192.168.111.123/2023-03-27'; Guard(bmpImg, TBitmap.Create); bmpImg.Assign(jpg); bmpImg.Canvas.Font.Name := 'Tahoma'; bmpImg.Canvas.Font.Color := clSilver; bmpImg.Canvas.Font.Size := 45; bmpImg.Canvas.Font.Style := bmpImg.Canvas.Font.Style + [fsBold]; // bmpImg.Canvas.TextOut(0, nH + 10, sText); var wAlpha: WORD := 50; nW := bmpImg.Canvas.TextWidth(sText); if bmpImg.Width > nW then nW := bmpImg.Width; nH := bmpImg.Height + bmpImg.Canvas.TextHeight(sText) + 0; Guard(bmpWater, TBitmap.Create); bmpWater.PixelFormat := pf4bit; bmpWater.Canvas.Font.Assign(bmpImg.Canvas.Font); bmpWater.Canvas.Brush.Color := clWhite; bmpWater.Canvas.Brush.Style := bsSolid; // bmpWater.Canvas.Font.Color := bmpWater.Canvas.Font.Color and $00FFFFFF or wAlpha shl 24; bmpWater.SetSize(nW, bmpImg.Height + bmpImg.Canvas.TextHeight(sText) + 0); bmpWater.Canvas.Draw((nW div 2) - (bmpImg.Width div 2), 0, bmpImg); bmpWater.Canvas.TextOut(0, bmpImg.Height + 0, sText); // RotateBitmap_PlgBlt(bmpWater, -0.7, true, clWhite); // var ii: Integer; // var jj: Integer; // for ii := 0 to bmpWater.Width - 1 do // for jj := 0 to bmpWater.Height - 1 do //// if ((ii + jj) mod 4) = 0 then //// bmpWater.Canvas.Pixels[ii, jj] := clWhite ////// else if bmpWater.Canvas.Pixels[ii, jj] <> clWhite then //// else if bmpWater.Canvas.Pixels[ii, jj] = clBlack then //// bmpWater.Canvas.Pixels[ii, jj] := clGray; // // if bmpWater.Canvas.Pixels[ii, jj] <> clWhite then // bmpWater.Canvas.Pixels[ii, jj] := (bmpWater.Canvas.Pixels[ii, jj] and $FF000000) or wAlpha shl 24; Guard(bmp, TBitmap.Create); bmp.SetSize(4961, 7016); sTxtPath := 'C:\Users\kku\Desktop\¶óÀ̼±½º µ¿ÀÇ.txt'; if FileExists(sTxtPath) then begin Guard(StrList, TStringList.Create); StrList.LoadFromFile(sTxtPath, TEncoding.UTF8); bmp.Canvas.Font.Size := 80; for i := 0 to StrList.Count - 1 do begin bmp.Canvas.TextOut(500, 700 + (i * 200), StrList[i]); end; end; ScalePercentBmp(bmpWater, 250); bmpWater.TransparentColor := clWhite; bmpWater.Transparent := true; var Graphics: TGPGraphics; var gBrush: TGPBrush; var gFont: TGPFont; var ImageAttributes: TGPImageAttributes; var gImg: TGPImage; var dest: TGPRect; var GPStream: IStream; var ms: TMemoryStream; Graphics := TGPGraphics.Create(bmp.Canvas.Handle); Guard(ms, TMemoryStream.Create); bmpWater.SaveToStream(ms); ms.Position := 0; GPStream := TStreamAdapter.Create(ms, soOwned) as IStream; gImg := TGPImage.Create(GPStream); dest.Width := gImg.GetWidth; dest.Height := gImg.GetHeight; gFont := TGPFont.Create(bmp.Canvas.Handle); gBrush := TGPBrush.Create;// Create(System.UIConsts.MakeColor(255, 0, 0)); ImageAttributes := TGPImageAttributes.Create; // ImageAttributes.SetColorMatrix(MakeColorMatrix(1.0, 1.0, 1.0, wAlpha div 255)); ImageAttributes.SetColorKey(System.UIConsts.MakeColor(255, 255, 255), System.UIConsts.MakeColor(255, 255, 255)); ImageAttributes.SetColorMatrix(cTrMatrix); Graphics.SetTextRenderingHint(TextRenderingHintAntiAlias); // Graphics.DrawImage(gImg, dest, 0, 0, Round(gImg.GetWidth), Round(gImg.GetHeight), UnitPixel, ImageAttributes); // Graphics.Draw String(PChar(sTxtPath), -1, gFont, MakePoint(500, 500), ImageAttributes, gBrush); nW := bmpWater.Width;// * 1.5; nH := bmpWater.Height; // * 1.5; nX := (bmp.Width div 2) - (nW div 2); nY := (bmp.Height div 2) - (bmp.Height div 3); dest.X := nX; dest.Y := nY; Graphics.DrawImage(gImg, dest, 0, 0, Round(gImg.GetWidth), Round(gImg.GetHeight), UnitPixel, ImageAttributes); // bmp.Canvas.StretchDraw(Rect(nX, nY, nX + nW, nY + nH), bmpWater); // DrawBitmapWater(bmp.Canvas.Handle, nX, nY, bmpWater); nY := (bmp.Height div 2) + (bmp.Height div 10); dest.Y := nY; Graphics.DrawImage(gImg, dest, 0, 0, Round(gImg.GetWidth), Round(gImg.GetHeight), UnitPixel, ImageAttributes); // bmp.Canvas.StretchDraw(Rect(nX, nY, nX + nW, nY + nH), bmpWater); ImageEn.Assign(bmp); ImageEn.Stretch; ImageEn.Fit; // ImageEn.AutoFit := true; ImageEn.Update; // ImageEn.IO.SaveToFileJpeg('C:\Users\kku\Desktop\test.jpg'); // ImageEn.IO.loadfroms //exit; // if not FileExists(edPath.Text) then // exit; // // ImageEn.IO.LoadFromFile(edPath.Text); end; procedure TDlgWater2ImgMain.btnWaterClick(Sender: TObject); var bmp: TBitmap; nLayerIdx, nTxtW, nTxtH: Integer; R: TRect; sText: String; C, S, Rads: Single; begin Guard(bmp, TBitmap.Create); bmp.SetSize(4961, 7016); // bmp.SetSize(7016, 4961); // bmp.SetSize(4061, 6216); Font_.Name := 'µ¸À½'; Font_.Size := 500; Font_.Orientation := 490; ImageEn.Assign(bmp); ImageEn.Stretch; ImageEn.Fit; // ImageEn.AutoFit := true; ImageEn.Update; nLayerIdx := ImageEn.LayersAdd; ImageEn.Proc.Fill(TColor2TRGB(clWhite)); sText := 'Áêºñ½º ´ÙÀÌ¾îÆ®'; ImageEn.Bitmap.Canvas.Font := Font_; nTxtW := ImageEn.Bitmap.Canvas.TextWidth(sText); nTxtH := ImageEn.Bitmap.Canvas.TextHeight(sText); // ImageEn.Bitmap.Canvas.TextOut(0, 0, sText); Rads := 0.45; C := Cos(Rads); S := Sin(Rads); ZeroMemory(@R, SizeOf(R)); R.Left := ImageEn.Bitmap.Width - (ImageEn.Bitmap.Width div 2) - Round(nTxtW / 3.5); // 1600;// Round((nTxtW - nTxtW * C + nTxtH * S) / 5); R.Top := ImageEn.Bitmap.Height - (ImageEn.Bitmap.Height div 2) - Round((nTxtH - nTxtW * S - nTxtH * C) / 2); // R.Top := ImageEn.Bitmap.Height - nTxtW - Round(nTxtW * 0.45); R.Width := ImageEn.Bitmap.Width; R.Height := ImageEn.Bitmap.Height; ImageEn.Proc.TextOut(R.Left, R.Top, 'Áêºñ½º ´ÙÀÌ¾îÆ®', 'µ¸¿ò', 400, clGray, [fsBold], 45); // ImageEn.Proc.TextOut(Align_Text_Horz_Center, R.Top, 'Áêºñ½º ´ÙÀÌ¾îÆ®', 'µ¸¿ò', 400, clGray, [fsBold], 45); // ImageEn.Proc.TextOut(R, sText, Font_, 45); // ImageEn.Proc.TextOut(Align_Text_Horz_Center, Align_Text_Horz_Center, 'Copyright Skynet', 'Arial', 200, clRed, [fsBold], 45, True); ImageEn.Proc.SetTransparentColors(TColor2TRGB(clWhite), TColor2TRGB(clWhite), 0); ImageEn.Layers[nLayerIdx].Transparency := 40; ImageEn.LayersMergeAll; ImageEn.Update; end; function DrawBitmapWater(aDestDC: HDC; nX, nY: Integer; aSrcBmp: TBitmap): Boolean; stdcall; //const // cTrMatrix: TColorMatrix = ( // (1.0, 0.0, 0.0, 0.0, 0.0), // (0.0, 1.0, 0.0, 0.0, 0.0), // (0.0, 0.0, 1.0, 0.0, 0.0), // (0.0, 0.0, 0.0, 0.5, 0.0), // (0.0, 0.0, 0.0, 0.0, 1.0)); var GPGraphics: TGPGraphics; ms: TMemoryStream; // GPStream: IStream; GPImg: TGPImage; ImageAttributes: TGPImageAttributes; GPRect: TGPRect; nWW, nHH: Integer; begin Result := true; try Guard(ms, TMemoryStream.Create); aSrcBmp.SaveToStream(ms); ms.Position := 0; // ms.SaveToFile('C:\Users\kku\Desktop\test111.bmp'); Guard(GPGraphics, TGPGraphics.Create(aDestDC)); // GPGraphics.SetSmoothingMode(SmoothingModeAntiAlias); GPGraphics.SetPageScale(0.33); // IStream ¸Þ¸ð¸® ÇØÁ¦¸¦ À§ÇØ ¿©±â¿¡ º¯¼ö ¼±¾ðÇØ¾ß ÇÔ 24_0125 10:58:12 kku var GPStream: IStream := TStreamAdapter.Create(ms, soOwned) as IStream; Guard(GPImg, TGPImage.Create(GPStream)); Guard(ImageAttributes, TGPImageAttributes.Create); // Èò»ö ¹è°æ Åõ¸íó¸® ImageAttributes.SetColorKey(System.UIConsts.MakeColor(255, 255, 255), System.UIConsts.MakeColor(255, 255, 255)); // »¡°£»ö ¹è°æ Åõ¸íó¸® // ImageAttributes.SetColorKey(System.UIConsts.MakeColor(255, 0, 0), System.UIConsts.MakeColor(255, 0, 0)); // ImageAttributes.SetColorMatrix(MakeColorMatrix(0.1, 0.1, 0.5, 0.2)); // Gray, Çϴûö // ImageAttributes.SetColorMatrix(MakeColorMatrix(0.1, 0.5, 0.5, 0.2)); // Gray, ³ì»ö // ImageAttributes.SetColorMatrix(MakeColorMatrix(0.1, 1.1, 0.5, 0.2)); // Gray, ¿¬µÎ»ö ImageAttributes.SetColorMatrix(MakeColorMatrix(0.2, 0.2, 0.2, 0.2)); // Gray, ½Ç¹ö // ImageAttributes.SetColorMatrix(MakeColorMatrix(0.2, 0.2, 0.2, 0.3)); // Gray, ȸ»ö // ImageAttributes.SetColorMatrix(MakeTransparentMatrix(0.4)); // ±× ¿Ü mode, type ¿É¼Ç ÀÇ¹Ì ¾øÀ½.. nWW := GPImg.GetWidth; nHH := GPImg.GetHeight; // var GPUnit: TUnit := GPGraphics.GetPageUnit; GPRect.X := nX; GPRect.Y := nY; GPRect.Width := nWW; GPRect.Height := nHH; GPGraphics.DrawImage(GPImg, GPRect, 0, 0, Round(nWW), Round(nHH), UnitPixel, ImageAttributes); except Result := false; end; end; procedure TDlgWater2ImgMain.btnWaterGDIPClick(Sender: TObject); var bmp, bmpW: TBitmap; sText: String; nX, nY: Integer; begin Guard(bmp, TBitmap.Create); // bmp.SetSize(4961, 7016); bmp.SetSize(7016, 4961); bmp.Canvas.Font.Size := 500; bmp.Canvas.Font.Name := 'µ¸À½'; bmp.Canvas.Font.Style := bmp.Canvas.Font.Style + [fsBold]; sText := 'Áêºñ½º ´ÙÀÌ¾îÆ®'; Guard(bmpW, TBitmap.Create); bmpW.SetSize(bmp.Canvas.TextWidth(sText), bmp.Canvas.TextHeight(sText)); bmpW.Canvas.Font := bmp.Canvas.Font; bmpW.Canvas.Font.Color := clSilver; bmpW.Canvas.TextOut(0, 0, sText); bmpW.TransparentColor := clWhite; bmpW.Transparent := true; RotateBitmap_PlgBlt(bmpW, -0.8, true, clWhite); // ScalePercentBmp(bmpW, 60); nX := bmp.Width - (bmp.Width div 2) - (bmpW.Width div 2); nY := bmp.Height - (bmp.Height div 2) - (bmpW.Height div 2); DrawBitmapWaterEx(bmp.Canvas.Handle, nX, nY, bmpW); ImageEn.Assign(bmp); ImageEn.Stretch; ImageEn.Fit; // ImageEn.AutoFit := true; ImageEn.Update; end; procedure TDlgWater2ImgMain.btnWriteClick(Sender: TObject); begin // ImageEn.IO. AddWatermarkTextLayer(ImageEn, Font_, edWater.Text, 40, false); // AddWatermarkImageLayer(ImageEn, 'D:\Temp\jIns.prop - º¹»çº».png', 20, false); ImageEn.IO.SaveToFile(edPath.Text + '_Water' + ExtractFileExt(edPath.Text)); end; procedure TDlgWater2ImgMain.Button1Click(Sender: TObject); var sPath, sText: String; png: TPngImage; R: TRect; i: Integer; begin sPath := 'C:\taskToCSG\eCrmHE\Utils\EXE_BSWmcr\BSWmcr\bin\Release\test.png'; if not FileExists(sPath) then exit; Guard(png, TPngImage.Create); png.LoadFromFile(sPath); R.Left := 72; R.Top := 52; R.Width := 63; R.Height := 10; png.Canvas.Pen.Color := clWhite; png.Canvas.Pen.Style := psSolid; png.Canvas.Brush.Color := clWhite; png.Canvas.Brush.Style := bsSolid;// bsBDiagonal; png.Canvas.FillRect(R); sText := 'Ãâ·Â Â÷´Ü'; for i := 1 to 99 do begin png.Canvas.Font.Size := i; if (png.Canvas.TextHeight(sText) - 1) >= 10 then begin break; end; end; png.Canvas.TextRect(R, sText, [tfCenter, tfEndEllipsis, tfVerticalCenter]); png.Canvas.Pen.Color := clBlack; png.Canvas.Pen.Style := psDot; png.Canvas.MoveTo(R.Left, R.Top); png.Canvas.LineTo(R.Left + R.Width, R.Top); png.Canvas.LineTo(R.Left + R.Width, R.Top + R.Height); png.Canvas.LineTo(R.Left, R.Top + R.Height); png.Canvas.LineTo(R.Left, R.Top); // png.Canvas.DrawFocusRect(R); Image1.Picture.Assign(png); end; end.