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

421 lines
13 KiB
Plaintext
Raw Blame History

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.