421 lines
13 KiB
Plaintext
421 lines
13 KiB
Plaintext
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\<5C><><EFBFBD>̼<EFBFBD><CCBC><EFBFBD> <20><><EFBFBD><EFBFBD>.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 := '<27><><EFBFBD><EFBFBD>';
|
||
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 := '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̾<EFBFBD>Ʈ';
|
||
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, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̾<EFBFBD>Ʈ', '<27><><EFBFBD><EFBFBD>', 400, clGray, [fsBold], 45);
|
||
// ImageEn.Proc.TextOut(Align_Text_Horz_Center, R.Top, '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̾<EFBFBD>Ʈ', '<27><><EFBFBD><EFBFBD>', 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 <20><EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20><> 24_0125 10:58:12 kku
|
||
var GPStream: IStream := TStreamAdapter.Create(ms, soOwned) as IStream;
|
||
Guard(GPImg, TGPImage.Create(GPStream));
|
||
Guard(ImageAttributes, TGPImageAttributes.Create);
|
||
|
||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
|
||
ImageAttributes.SetColorKey(System.UIConsts.MakeColor(255, 255, 255), System.UIConsts.MakeColor(255, 255, 255));
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
|
||
// 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, <20>ϴû<CFB4>
|
||
// ImageAttributes.SetColorMatrix(MakeColorMatrix(0.1, 0.5, 0.5, 0.2)); // Gray, <20><><EFBFBD><EFBFBD>
|
||
// ImageAttributes.SetColorMatrix(MakeColorMatrix(0.1, 1.1, 0.5, 0.2)); // Gray, <20><><EFBFBD>λ<EFBFBD>
|
||
ImageAttributes.SetColorMatrix(MakeColorMatrix(0.2, 0.2, 0.2, 0.2)); // Gray, <20>ǹ<EFBFBD>
|
||
// ImageAttributes.SetColorMatrix(MakeColorMatrix(0.2, 0.2, 0.2, 0.3)); // Gray, ȸ<><C8B8>
|
||
// ImageAttributes.SetColorMatrix(MakeTransparentMatrix(0.4)); // <20><> <20><> mode, type <20>ɼ<EFBFBD> <20>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||
|
||
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 := '<27><><EFBFBD><EFBFBD>';
|
||
bmp.Canvas.Font.Style := bmp.Canvas.Font.Style + [fsBold];
|
||
|
||
sText := '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̾<EFBFBD>Ʈ';
|
||
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 - <20><><EFBFBD>纻.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 := '<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>';
|
||
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.
|