From 0756bf12d10cf1b7f78c571de0a9ad69cbaeb7ca Mon Sep 17 00:00:00 2001
From: curtis <curtis@i-mps.com>
Date: 星期一, 30 三月 2026 14:24:17 +0800
Subject: [PATCH] fix: 更新內部引用方法參照

---
 iis_image_process.pas | 2712 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 2,712 insertions(+), 0 deletions(-)

diff --git a/iis_image_process.pas b/iis_image_process.pas
new file mode 100644
index 0000000..7c84a7f
--- /dev/null
+++ b/iis_image_process.pas
@@ -0,0 +1,2712 @@
+// 公司 IIS_ImageProcess 相關方法
+unit IIS_ImageProcess;
+
+interface
+uses EnImgScr,
+     EnDiGrph, { for TDibGraphic }
+     EnTifGr,  { for TTifGraphic }
+     EnJpgGr,  { for TJpegGraphic}
+     EnPngGr,  { for TPngGraphic }
+     EnTransf, { for TImageTransform }
+     EnMisc,   { for MinFloat }
+     EnRubber, { for TRubberbandMouseHandler }
+     EnPrint,  { for TEnvisionPrintMode, TDibGraphicPrinter }
+     DeskewTransform,
+     WatermarkTransform,
+     mpsBarco,
+     NBLib,
+     Barcode,
+     vrsx,
+     dExif,dIPTC,jpeg,
+     windows,Graphics,SysUtils,dialogs,classes,iisunit,Printers,
+     FindBlackSpots,
+     ExtCtrls;
+
+
+Procedure Rotate(Graphic:TDibGraphic;Angle : Double); //旋轉
+Procedure DeskewImg(Graphic : TDibGraphic);Overload; //歪斜矯正
+Procedure DeskewImg(Graphic : TDibGraphic;CR_Graphic : TDibGraphic);Overload; //以黑白影像歪斜矯正後再轉彩色影像
+Procedure CleanupBorder(Graphic : TDibGraphic); // 清黑邊
+procedure NegativeImg(Graphic : TDibGraphic); //反向
+procedure ConvertToGray(Graphic : TDibGraphic); //轉成灰階
+Function GetTag(FileName :String):String; //將資訊從CustomTag裡取出
+Procedure SetTag(FileName,DataStr :String); //將資訊記在CustomTag裡
+Procedure CreateStamp(FileName,Title,UserID,StampDate:String;StampWidth,StampHeight:Single); //產生印章
+procedure CreateNote(FileName,Title:String); //產生便條紙
+procedure CreateDraft(FileName,Title:String); //產生便條紙
+Procedure CreateReportImg(FileName,BarCode,Memo,BGFileName:String;DataList,ItemList:TStringlist); //產生補件清單影像
+Procedure CreateReportImg_JSON(FileName,BGFileName,BarCode,JSONStr:String);
+procedure PrintBarcode(const FileName, Content: WideString; L, T, Width,
+      Height: Integer); //印條碼
+procedure Watermark(logoBmp:TBitmap;Opacity:Byte;Content:String;Graphic:TDibGraphic);  //讀bmp印在正中央
+procedure Watermark1(Opacity:Byte;Content,Content1:String;Graphic:TDibGraphic); //自行產生文字330度印在左上右下
+procedure Watermark1_Hong(Opacity:Byte;Content,Content1:String;Graphic:TDibGraphic;ImgH:Integer); //自行產生文字330度印在左上右下
+procedure Watermark1_Hong_New(Opacity:Byte;Content,Content1:String;Graphic,DisGraphic:TDibGraphic;ImgH:Integer); //自行產生文字330度印在左上右下
+
+procedure Watermark2(logoBmp:TBitmap;Opacity:Byte;Content:String;Graphic:TDibGraphic);  //讀bmp印在左上方
+Procedure FindPoint(Graphic:TDibGraphic;Var UpPointL,UpPointR,DownPointL:TPoint;Var FormWidth,FormHeight:Integer;Anchor:String);overload;
+Procedure FindPoint(Graphic:TDibGraphic;Var UpPointL,UpPointR,DownPointL:TPoint;Anchor:String);overload;
+function GetBlackSpots(Graphic:TDibGraphic;L, T, R, B, Ratio: Integer): WideString;
+Procedure FindBlackPoint(Graphic:TDibGraphic;Var BlackPoint:Tpoint);
+Function Get_OMR(Graphic:TDibGraphic;iRect:Trect):integer; //取點數
+Function GetSelectRect(ISB:TImageScrollBox):TRect; //取出影像上的框選範圍
+Function GetSelectRect_Back(ISB:TImageScrollBox):TRect; //取出影像上的框選範圍(從右下回來)
+function GetSelectRect2String(ISB:TImageScrollBox;UpPointL:TPoint): WideString;  //取出影像上的框選範圍轉公分字串
+function GetSelectRect_Black2String(ISB:TImageScrollBox;BlackPoint:TPoint): WideString;  //取出影像上的框選範圍從右下小黑框轉公分字串
+
+Procedure SetSelectRect(ISB:TImageScrollBox;iRect:TRect); //顯示出指定的框
+Procedure SetSelectRect_Original(ISB:TImageScrollBox;iRect:TRect); //顯示出指定的框(不縮放)
+Procedure ShowKeyinRect(ISB:TImageScrollBox;iRect:TRect); //顯示登打位置
+procedure ImageResize(Graphic:TDibGraphic;DesWidth,DesHeight:Integer);  //影像縮放
+Procedure DpiResize(Graphic:TDibGraphic;DesDpi:Integer;CheckDpi:Boolean); //改變Dpi並依Dpi縮放影像
+
+Procedure DrawPointLine(ISB:TImageScrollBox;UpPointL,UpPointR,DownPointL:TPoint); //畫十字位置
+Procedure Gray2BW_RTS(ISB:TImageScrollBox;Para1,Para2,Para3:Integer);Overload;
+Procedure Gray2BW_RTS(ISB:TImageScrollBox;Para1,Para2,Para3:Integer;Part:Trect); Overload; //用RTS灰階轉黑白
+Procedure Color2BW_RTS(ISB:TImageScrollBox;Para1,Para2,Para3:Integer); Overload; //用RTS彩色轉黑白
+Procedure Color2BW_RTS(ISB:TImageScrollBox;Para1,Para2,Para3:Integer;Part:Trect); Overload; //用RTS彩色轉黑白
+procedure Emboss(ISB:TImageScrollBox);
+Procedure BrightnessImg(ISB:TImageScrollBox;Precent:Integer); //調整亮度
+Procedure ConvertToBW(Graphic : TDibGraphic); //轉成黑白
+Procedure ConvertTo256Gray(Graphic : TDibGraphic); //轉成256灰階
+
+Procedure ClearLine(Graphic : TDibGraphic;bt:Integer); //清影像上的線條
+procedure CropImg(Graphic : TDibGraphic;iRect:TRect); //切範圍影像
+Function GetPosAngle(UpL,DownL,UpR:TPoint):Single; //取三點夾角角度
+function CheckSize(ISB:TImageScrollBox;UpL,UpR,DownL:TPoint;DefWidth,DefHeight:String): WideString;  //檢查Size並縮放
+Function GetPixBW( srcGraphic : TDibGraphic; x,y:integer ):integer;
+Procedure BmpConverJpg(Source,SaveFileName:STring); //Bmp轉不壓縮jpeg
+Procedure BWTif2Jpg(Graphic:TDibGraphic); //黑白Tif轉彩色jpg
+Procedure Color2tif(Graphic:TObject;FileName:String); //彩色影像存Tif
+
+Procedure FieldMask(ISB:TImageScrollBox;SiteList,Mode: WideString;UpPointL:TPoint); //遮罩 Mode:mark mask
+procedure SaveAnnotation(ISB:TImageScrollBox;FileName: WideString); //遮罩存檔
+Procedure FilterColor(SoISB,DeISB:TImageScrollBox;Ration:Integer); //濾掉顏色 留黑白
+procedure JpgReSize_Exif(Maxlength,Quality:integer;OldFile,NewFile:String;WaterGraphic:TGraphic;PrintDate:Boolean); //照片縮放包含Exif
+Function GetExif_CaptureDateTime(FileName : String):String; //取出檔案裡的Exif拍攝日期
+procedure SetKeyinRect_New( ISB:TImageScrollBox; SiteStr, SiteStr_Black,FormHeight: String; UpPointL,UpPointR:TPoint); overload;
+procedure SetKeyinRect_New( ISB:TImageScrollBox; SiteStr, SiteStr_Black,FormHeight: String; UpPointL,UpPointR:TPoint;SP:TShape); overload;
+Procedure Image_Smooth(Graphic:TDibGraphic);
+procedure PrintImg(FileName, LoginID, Datetime,Path: WideString;WaterBmp:TBitmap); overload;
+procedure PrintImg(FileName, LoginID, Datetime,Path: WideString;WaterBmp:TBitmap;Spec_Page:Integer); overload;
+procedure PrintImg(FileName, LoginID, Datetime,Path: WideString;WaterBmp:TBitmap;Spec_Page:Integer;NeedSetup:Boolean); overload;
+
+
+
+implementation
+
+Procedure Rotate(Graphic:TDibGraphic;Angle : Double);
+var
+    Transform : TRotateTransform;
+    AngleStr  : String;
+    FUndoGraphic  : TDibGraphic;
+begin
+    FUndoGraphic  := TDibGraphic.Create;
+    FUndoGraphic.Assign(Graphic);
+    Transform := TRotateTransform.Create;
+    try
+      Transform.Angle           := Angle;
+      //Transform.BackgroundColor := MakeRgb(255, 255, 255);
+      Transform.ApplyOnDest(FUndoGraphic, Graphic);
+    finally
+      Transform.Free;
+      FUndoGraphic.Free;
+    end;
+end;
+
+Procedure DeskewImg(Graphic : TDibGraphic);
+Var
+  Deskew:TDeskewTransform;
+begin
+  // Create a deskew component
+  Deskew:=TDeskewTransform.Create;
+  try
+    //Deskew.ImageExpansion := True;
+    //Deskew.FastEstimation := True;
+    // Apply the deskew transform to the image component
+    Deskew.Apply(Graphic);
+    // Redraw the deskewed image
+  finally
+  //Destroy the deskew component
+  Deskew.Free;
+  end;
+
+end;
+
+Procedure DeskewImg(Graphic : TDibGraphic;CR_Graphic : TDibGraphic);Overload; //以黑白影像歪斜矯正後再轉彩色影像
+Var
+  Deskew:TDeskewTransform;
+  Angle : Single;
+begin
+  // Create a deskew component
+  Deskew:=TDeskewTransform.Create;
+  try
+    //Deskew.ImageExpansion := True;
+    //Deskew.FastEstimation := True;
+    // Apply the deskew transform to the image component
+    Angle := Deskew.DetectSkew(Graphic);
+    Deskew.Apply(Graphic);
+    Rotate(CR_Graphic,Angle);
+    // Redraw the deskewed image
+  finally
+  //Destroy the deskew component
+  Deskew.Free;
+  end;
+
+end;
+
+
+Procedure CleanupBorder(Graphic : TDibGraphic); // 清黑邊
+var
+    Transform : TNBCleanupBorderTransform;
+    FUndoGraphic : TDibGraphic;
+begin
+  FUndoGraphic := TDibGraphic.Create;
+  try
+    FUndoGraphic.Assign(Graphic);
+    Transform := TNBCleanupBorderTransform.Create;
+    try
+      Transform.MarginInches := 5;
+      Transform.ApplyOnDest(FUndoGraphic, Graphic);
+    finally
+        Transform.Free;
+    end;
+  Finally
+    FUndoGraphic.Free;
+  end;
+end;
+
+procedure NegativeImg(Graphic : TDibGraphic);   //反向
+var
+    Transform : TNegativeTransform;
+    FUndoGraphic : TDibGraphic;
+begin
+ FUndoGraphic := TDibGraphic.Create;
+ try
+    FUndoGraphic.Assign(Graphic);
+    Transform := TNegativeTransform.Create;
+    try
+        Transform.ApplyOnDest(FUndoGraphic, Graphic);
+    finally
+        Transform.Free;
+    end;
+ finally
+    FUndoGraphic.Free;
+ end;
+end;
+
+procedure ConvertToGray(Graphic    : TDibGraphic); //轉灰階
+var
+    Transform : TConvertToGrayTransform;
+    FUndoGraphic : TDibGraphic;
+begin
+  FUndoGraphic := TDibGraphic.Create;
+  try
+    FUndoGraphic.Assign(Graphic);
+    Transform := TConvertToGrayTransform.Create;
+    try
+        //Transform.OnProgress := Self.OnProgress;
+        Transform.ApplyOnDest(FUndoGraphic, Graphic);
+    finally
+        Transform.Free;
+    end;
+  finally
+  FUndoGraphic.Free;
+  end;
+
+end;
+
+Function GetTag(FileName :String):String; //將資訊從CustomTag裡取出
+var
+  Tif : TTiffGraphic;
+begin
+  Result := '';
+  if (Uppercase(ExtractFileExt(FileName)) = '.TIF') or (Uppercase(ExtractFileExt(FileName))='.TIFF')  then
+  begin
+    Tif := TTiffGraphic.Create;
+    Try
+      Tif.LoadFromFile(FileName);
+      IF Tif.ImageDescriptionTag <> '' then
+        Result := Tif.ImageDescriptionTag;
+    Finally
+    Tif.Free;
+    end;
+  end;
+end;
+
+Procedure SetTag(FileName,DataStr :String); //將資訊記在CustomTag裡
+var
+  Tif : TTiffGraphic;
+begin
+  if (Uppercase(ExtractFileExt(FileName)) = '.TIF') or (Uppercase(ExtractFileExt(FileName))='.TIFF')  then
+  begin
+    Tif := TTiffGraphic.Create;
+    Try
+      Tif.LoadFromFile(FileName);
+      Tif.ImageDescriptionTag := DataStr;
+      Tif.SaveToFile(FileName);
+    Finally
+    Tif.Free;
+    end;
+  end;
+end;
+
+Procedure CreateStamp(FileName,Title,UserID,StampDate:String;StampWidth,StampHeight:Single); //產生印章
+var i,v:integer;
+    bmp:Tbitmap;
+    s:string;
+    ISB : TImageScrollBox;
+    TextH,TextW : Integer;
+    X,Y : Integer;
+    seg:Integer;
+begin
+  IF FileExists(FileName) Then
+    DeleteFile(FileName);
+  //開新影像檔
+  bmp := Tbitmap.Create;
+  ISB := TImageScrollBox.Create(nil);
+  try
+    bmp.Width :=  Round(StampWidth/2.54 *300);
+    bmp.Height:=  Round(StampHeight/ 2.54 *300);
+    bmp.Monochrome := False;
+
+    bmp.Canvas.Font.PixelsPerInch := 300;
+    bmp.Canvas.Font.Size := 24;
+    bmp.Canvas.Font.Style := [fsBold];
+    bmp.Canvas.Font.Name := '標楷體';
+    bmp.Canvas.Font.Color := clBlue;
+
+    bmp.Canvas.Brush.Color:= clwhite;
+    bmp.Canvas.Rectangle(1,1,bmp.Width,bmp.Height);
+
+    bmp.Canvas.Pen.Width:=24;
+    bmp.Canvas.Pen.Color := clblue;
+    bmp.Canvas.Rectangle(1,1,bmp.Width,bmp.Height);
+    bmp.Transparent := True;
+    TextH := bmp.Canvas.TextHeight('退');
+    TextW := bmp.Canvas.TextWidth('退');
+
+    Seg := ((bmp.Height - 60 - TextH) - (Length(Title)*TextH)) Div (length(Title)-1);
+    X := (Bmp.Width Div 2) - (TextW Div 2);
+    Y := 15;
+    for i := 1 to length(Title) do
+    begin
+      bmp.Canvas.TextOut(X,Y,Title[i]);
+      if i < length(Title) then
+        Y := Y + seg +(TextH)
+      else
+        Y := Y + TextH;
+    end;
+    bmp.Canvas.Font.Size := 10;
+    bmp.Canvas.Font.Name := '標楷體';
+    TextW := bmp.Canvas.TextWidth(GetDate);
+    bmp.Canvas.TextOut(((bmp.Width) div 2)-(TextW div 2),Y+20,StampDate);
+    Y := Y + 60;
+    bmp.Canvas.Font.Size := 10;
+    bmp.Canvas.Font.Name := '標楷體';
+    TextW := bmp.Canvas.TextWidth(UserID);
+    bmp.Canvas.TextOut((bmp.Width div 2)-(TextW div 2),Y+20,UserID);
+    {if Title <> '' then
+    begin
+      TextW := bmp.Canvas.TextWidth(Title);
+      bmp.Canvas.TextOut((bmp.Width div 2) - (TextW div 2) ,Round(3*300) ,Title );
+
+    end;}
+    bmp.SaveToFile(ExtractFilePath(FileName)+'tmp.bmp');
+    //ISB.Graphic.Canvas.Assign(bmp.Canvas);
+    ISB.LoadFromFile(ExtractFilePath(FileName)+'tmp.bmp',1);
+    DeleteFile(ExtractFilePath(FileName)+'tmp.bmp');
+    //showmessage(ViewPath+'note.bmp');
+    ISB.Graphic.XDotsPerInch:=300;
+    ISB.Graphic.YDotsPerInch:=300;
+    ISB.SaveToFile(FileName);
+  finally
+  bmp.Free;
+  ISB.Free;
+  end;
+end;
+
+procedure CreateNote(FileName,Title:String); //產生便條紙
+var i,v:integer;
+    bmp:Tbitmap;
+    s:string;
+    ISB : TImageScrollBox;
+    TextW : Integer;
+begin
+  IF FileExists(FileName) Then
+    DeleteFile(FileName);
+  //開新影像檔
+  bmp := Tbitmap.Create;
+  ISB := TImageScrollBox.Create(nil);
+  try
+    bmp.Width :=  8 * 300;
+    bmp.Height:=  11 * 300;
+    bmp.Monochrome := true;
+    bmp.Canvas.Font.Size := 60;
+
+    bmp.Canvas.Brush.Color:= clwhite;
+    bmp.Canvas.Rectangle(1,1,bmp.Width,bmp.Height);
+    if Title <> '' then
+    begin
+      TextW := bmp.Canvas.TextWidth(Title);
+      bmp.Canvas.TextOut((bmp.Width div 2) - (TextW div 2) ,Round(3*300) ,Title );
+
+    end;
+    bmp.SaveToFile(ExtractFilePath(FileName)+'tmp.bmp');
+    //ISB.Graphic.Canvas.Assign(bmp.Canvas);
+    ISB.LoadFromFile(ExtractFilePath(FileName)+'tmp.bmp' ,1);
+    DeleteFile(ExtractFilePath(FileName)+'tmp.bmp');
+    //showmessage(ViewPath+'note.bmp');
+    ISB.Graphic.XDotsPerInch:=300;
+    ISB.Graphic.YDotsPerInch:=300;
+    ISB.SaveToFile(FileName);
+  finally
+  bmp.Free;
+  ISB.Free;
+  end;
+end;
+
+procedure CreateDraft(FileName,Title:String); //產生便條紙
+var i,v:integer;
+    bmp:Tbitmap;
+    s:string;
+    ISB : TImageScrollBox;
+    TextW : Integer;
+begin
+  IF FileExists(FileName) Then
+    DeleteFile(FileName);
+  //開新影像檔
+  bmp := Tbitmap.Create;
+  ISB := TImageScrollBox.Create(nil);
+  try
+    bmp.Width :=  8 * 300;
+    bmp.Height:=  11 * 300;
+    bmp.Monochrome := False;
+    bmp.Canvas.Font.Size := 60;
+
+    bmp.Canvas.Brush.Color:= clwhite;
+    bmp.Canvas.Rectangle(1,1,bmp.Width,bmp.Height);
+    if Title <> '' then
+    begin
+      TextW := bmp.Canvas.TextWidth(Title);
+      bmp.Canvas.TextOut((bmp.Width div 2) - (TextW div 2) ,Round(0.5*300) ,Title );
+
+    end;
+    bmp.SaveToFile(ExtractFilePath(FileName)+'tmp.bmp');
+    //ISB.Graphic.Canvas.Assign(bmp.Canvas);
+    ISB.LoadFromFile(ExtractFilePath(FileName)+'tmp.bmp' ,1);
+    DeleteFile(ExtractFilePath(FileName)+'tmp.bmp');
+    //showmessage(ViewPath+'note.bmp');
+    ISB.Graphic.XDotsPerInch:=300;
+    ISB.Graphic.YDotsPerInch:=300;
+    ISB.SaveToFile(FileName);
+  finally
+  bmp.Free;
+  ISB.Free;
+  end;
+end;
+
+
+procedure PrintBarcode(const FileName, Content: WideString; L, T,
+  Width, Height: Integer);
+Var
+  Rect : TRect;
+  AsBarCode : TAsBarCode;
+  ISB : TImageScrollBox;
+  TextW : Integer;
+begin
+  AsBarCode := TAsBarCode.Create(nil);
+  ISB := TImageScrollBox.Create(nil);
+  try
+    Rect.Left := L-40;
+    Rect.Top := T-40;
+    Rect.Right := L+Width+40;
+    Rect.Bottom := T+Height+40;
+    ISB.LoadFromFile(FileName,1);
+    ISB.Graphic.Canvas.Brush.Color := clWhite;
+    ISB.Graphic.Canvas.FillRect(Rect);
+    AsBarcode.Typ :=  bcCode39;
+    AsBarCode.ShowText := bcoNone;
+    AsBarcode.Text := Content;
+    AsBarcode.Left := L;
+    AsBarcode.Top := T;
+    AsBarcode.Width := Width;
+    AsBarcode.Height := Height;
+
+    AsBarCode.DrawBarcode(ISB.Graphic.Canvas);
+
+    ISB.Graphic.Canvas.Font.Size := 28;
+    TextW := ISB.Graphic.Canvas.TextWidth(Content);
+
+    AsBarcode.Left := L + Round(Width Div 2)-(Textw div 2);
+    AsBarcode.Top := T + Height;
+    //AsBarcode.Top := Round(0.1/2.54*ISB.Graphic.XDotsPerInch);
+    AsBarCode.ShowText := bcoCode;
+
+    AsBarCode.DrawText(ISB.Graphic.Canvas);
+    ISB.SaveToFile(FileName);
+  finally
+    AsBarCode.Free;
+    ISB.Free;
+  end;
+end;
+
+Procedure CreateReportImg(FileName,BarCode,Memo,BGFileName:String;DataList,ItemList:TStringlist); //產生補件清單影像
+var i,v,v1:integer;
+    bmp:Tbitmap;
+    s:string;
+    ISB,ISB1 : TImageScrollBox;
+    TextW,TextH,NowX,NowY : Integer;
+    MemoList : TStringlist;
+    DRect,SRect:TRect;
+begin
+  IF FileExists(FileName) Then
+    DeleteFile(FileName);
+  //開新影像檔
+  bmp := Tbitmap.Create;
+  MemoList := TStringlist.Create;
+  ISB := TImageScrollBox.Create(nil);
+  ISB1 := TImageScrollBox.Create(nil);
+  try
+    bmp.Width :=  8 * 300;
+    bmp.Height:=  11 * 300;
+    bmp.Monochrome := False;
+    bmp.Canvas.Font.Size := 24;
+    bmp.Canvas.Font.Name := '標楷體';
+
+    bmp.Canvas.Brush.Color:= clwhite;
+    bmp.Canvas.Rectangle(1,1,bmp.Width,bmp.Height);
+
+    TextW := bmp.Canvas.TextWidth('測試');
+    TextH := bmp.Canvas.TextHeight('測試');
+
+    NowY := 600;
+    NowX := bmp.Width Div 2;
+    for i := 0 to DataList.Count - 1 do
+    begin
+
+      NowX := ((bmp.Width Div 2) * (i mod 2)) + 100;
+      bmp.Canvas.TextOut(NowX,NowY,DataList.Strings[i]);
+      NowY := NowY+ ((TextH * (i mod 2))+ (100*(i mod 2)));
+    end;
+    NowY := NowY +TextH+ 100;
+    bmp.Canvas.TextOut(100,NowY,'說明:');
+    NowY := NowY + TextH+20;
+    v:=1;
+    v1:=1;
+    for i := 1 to Length(Memo) do  //計算要換行字數
+    begin
+      TextW := bmp.Canvas.TextWidth(Copy(Memo,v,v1));
+
+      if TextW >= (bmp.Width - 250) then
+      begin
+        MemoList.Add(Copy(Memo,v,v1));
+        v := i+1;
+        v1:=0;
+      end;
+      inc(v1);
+    end;
+
+    if v <= length(Memo) then
+      MemoList.Add(Copy(Memo,v,length(Memo)));
+    for i := 0 to MemoList.Count - 1 do
+    begin
+      bmp.Canvas.TextOut(150,NowY,MemoList.Strings[i]);
+      NowY := NowY+TextH+20;
+    end;
+
+    //TextW := bmp.Canvas.TextHeight(Memo);
+
+
+    //bmp.Canvas.TextOut(150,NowY,Memo);
+    NowY := NowY + 100;
+    bmp.Canvas.TextOut(100,NowY,'補件項目:');
+    NowY := NowY +TextH+20;
+
+    for i := 0 to ItemList.Count - 1 do
+    begin
+      bmp.Canvas.TextOut(150,NowY,ItemList.Strings[i]);
+      NowY := NowY+TextH+50;
+    end;
+
+
+    bmp.SaveToFile(ExtractFilePath(FileName)+'tmp.bmp');
+    PrintBarcode(ExtractFilePath(FileName)+'tmp.bmp',BarCode,150,150,1600,150);
+    //ISB.Graphic.Canvas.Assign(bmp.Canvas);
+    ISB.LoadFromFile(ExtractFilePath(FileName)+'tmp.bmp' ,1);
+    DeleteFile(ExtractFilePath(FileName)+'tmp.bmp');
+    ISB1.LoadFromFile(BGFileName,1);
+    Srect := Rect(1,1,ISB.Graphic.Width,ISB.Graphic.Height);
+    DRect := Rect(1,1,ISB1.Graphic.Width,ISB1.Graphic.Height);
+
+    ISB1.Graphic.Canvas.CopyMode := SRCAND;
+    ISB1.Graphic.Canvas.CopyRect(DRect,ISB.Graphic.Canvas,SRect);
+    ISB1.Graphic.XDotsPerInch:=300;
+    ISB1.Graphic.YDotsPerInch:=300;
+    ISB1.SaveToFile(FileName);
+
+    //showmessage(ViewPath+'note.bmp');
+    {ISB.Graphic.XDotsPerInch:=300;
+    ISB.Graphic.YDotsPerInch:=300;
+    ISB.SaveToFile(FileName);}
+  finally
+  bmp.Free;
+  ISB.Free;
+  ISB1.Free;
+  MemoList.Free;
+  end;
+end;
+
+Procedure CreateReportImg_JSON(FileName,BGFileName,BarCode,JSONStr:String);
+var i,n,v,v1:integer;
+    bmp:Tbitmap;
+    s:string;
+    ISB,ISB1 : TImageScrollBox;
+    TextW,TextH,NowX,NowY : Integer;
+    MemoList,ItemList,PrtList : TStringlist;
+    DRect,SRect:TRect;
+begin
+  IF FileExists(FileName) Then
+    DeleteFile(FileName);
+  //開新影像檔
+  bmp := Tbitmap.Create;
+  MemoList := TStringlist.Create;
+  PrtList := TStringlist.Create;
+  ItemList := TStringlist.Create;
+  ISB := TImageScrollBox.Create(nil);
+  ISB1 := TImageScrollBox.Create(nil);
+  try
+    bmp.Width :=  8 * 300;
+    bmp.Height:=  11 * 300;
+    bmp.Monochrome := False;
+
+    bmp.Canvas.Font.PixelsPerInch := 300;
+    bmp.Canvas.Font.Size := 12;
+    bmp.Canvas.Font.Name := '標楷體';
+
+    bmp.Canvas.Brush.Color:= clwhite;
+    bmp.Canvas.Rectangle(1,1,bmp.Width,bmp.Height);
+
+    TextW := bmp.Canvas.TextWidth('測試');
+    TextH := bmp.Canvas.TextHeight('測試');
+
+
+    NowY := 600;
+    NowX := bmp.Width Div 2;
+    ////////Title///////
+    PrtList := Getjsonlist(JSONStr,'Title/Content');
+    for i := 0 to PrtList.Count - 1 do
+    begin
+      TextW := bmp.Canvas.TextWidth(PrtList.Strings[i]);
+      NowX := 300;
+      if UpperCase(Getjsondata(JSONStr,'Title/Align')) = 'CENTER' Then
+        NowX := (bmp.Width Div 2) - (TextW Div 2);
+      bmp.Canvas.TextOut(NowX,NowY,PrtList.Strings[i]);
+      NowY := NowY +TextH+ 20;
+    end;
+    ////////Prefix///////
+    NowY := NowY + 80;
+    PrtList := Getjsonlist(JSONStr,'Prefix/Content');
+    for i := 0 to PrtList.Count - 1 do
+    begin
+      TextW := bmp.Canvas.TextWidth(PrtList.Strings[i]);
+      NowX := 300;
+      if UpperCase(Getjsondata(JSONStr,'Prefix/Align')) = 'CENTER' Then
+        NowX := (bmp.Width Div 2) - (TextW Div 2);
+      bmp.Canvas.TextOut(NowX,NowY,PrtList.Strings[i]);
+      NowY := NowY +TextH+ 20;
+    end;
+    ////////Data/////////
+    NowY := NowY + 80;
+    ItemList := GetJsonObjList(JSONStr,'Data/Content');
+    for i := 0 to ItemList.Count - 1 do
+    begin
+      NowX := 300;
+      TextW := bmp.Canvas.TextWidth(ItemList.Strings[i]);
+      if UpperCase(Getjsondata(JSONStr,'Data/Align')) = 'CENTER' Then
+        NowX := (bmp.Width Div 2) - (TextW Div 2);
+      bmp.Canvas.TextOut(NowX,NowY,ItemList.Strings[i]);
+      NowX := NowX +TextW;
+      PrtList := Getjsonlist(JSONStr,'Data/Content/'+ItemList.Strings[i]);
+      for n := 0 to PrtList.Count - 1 do
+      begin
+        TextW := bmp.Canvas.TextWidth(PrtList.Strings[n]);
+        bmp.Canvas.TextOut(NowX,NowY,PrtList.Strings[n]);
+        NowY := NowY +TextH+ 20;
+      end;
+    end;
+    ///////Memo////////
+    NowY := NowY + 80;
+    PrtList := Getjsonlist(JSONStr,'Memo/Content');
+    for i := 0 to PrtList.Count - 1 do
+    begin
+      TextW := bmp.Canvas.TextWidth(PrtList.Strings[i]);
+      NowX := 300;
+      if UpperCase(Getjsondata(JSONStr,'Memo/Align')) = 'CENTER' Then
+        NowX := (bmp.Width Div 2) - (TextW Div 2);
+      bmp.Canvas.TextOut(NowX,NowY,PrtList.Strings[i]);
+      NowY := NowY +TextH+ 20;
+    end;
+    ///////Suffix///////
+    NowY := NowY + 80;
+    PrtList := Getjsonlist(JSONStr,'Suffix/Content');
+    for i := 0 to PrtList.Count - 1 do
+    begin
+      TextW := bmp.Canvas.TextWidth(PrtList.Strings[i]);
+      NowX := 300;
+      if UpperCase(Getjsondata(JSONStr,'Suffix/Align')) = 'CENTER' Then
+        NowX := (bmp.Width Div 2) - (TextW Div 2);
+      bmp.Canvas.TextOut(NowX,NowY,PrtList.Strings[i]);
+      NowY := NowY +TextH+ 20;
+    end;
+    bmp.SaveToFile(ExtractFilePath(FileName)+'tmp.bmp');
+    PrintBarcode(ExtractFilePath(FileName)+'tmp.bmp',BarCode,150,150,1600,150);
+    //ISB.Graphic.Canvas.Assign(bmp.Canvas);
+    ISB.LoadFromFile(ExtractFilePath(FileName)+'tmp.bmp' ,1);
+    DeleteFile(ExtractFilePath(FileName)+'tmp.bmp');
+    ISB1.LoadFromFile(BGFileName,1);
+    Srect := Rect(1,1,ISB.Graphic.Width,ISB.Graphic.Height);
+    DRect := Rect(1,1,ISB1.Graphic.Width,ISB1.Graphic.Height);
+
+    ISB1.Graphic.Canvas.CopyMode := SRCAND;
+    ISB1.Graphic.Canvas.CopyRect(DRect,ISB.Graphic.Canvas,SRect);
+    ISB1.Graphic.XDotsPerInch:=300;
+    ISB1.Graphic.YDotsPerInch:=300;
+    ISB1.SaveToFile(FileName);
+
+    //showmessage(ViewPath+'note.bmp');
+    {ISB.Graphic.XDotsPerInch:=300;
+    ISB.Graphic.YDotsPerInch:=300;
+    ISB.SaveToFile(FileName);}
+  finally
+  bmp.Free;
+  ISB.Free;
+  ISB1.Free;
+  MemoList.Free;
+  PrtList.Free;
+  ItemList.Free;
+  end;
+end;
+
+procedure Watermark(logoBmp:TBitmap;Opacity:Byte;Content:String;Graphic:TDibGraphic);
+Var WatermarkTransform:TWatermarkTransform;
+    WatermarkImage:TDibGraphic;
+    WatermarkImage1:TDibGraphic;
+    S : String;
+    PW,PH : Integer;
+    x,y : Integer;
+    WH,WW : Integer;
+    destrect,sourRect : Trect;
+    WaterH,WaterW : Integer;
+begin
+   // Allows user to select a file (the watermark)
+   // Create the graphics specific for the selected extension
+   WatermarkImage1:=TDibGraphic.Create;
+   WatermarkImage:=TDibGraphic.Create;
+   try
+    // Load the watermark
+    WatermarkImage1.Assign(logoBmp);
+    IF (Graphic.Height > Graphic.Width) Then
+    begin
+      WaterW := (Graphic.Width div 3);
+      WaterH := Round( WatermarkImage1.Height * (WaterW / WatermarkImage1.Width));
+    end
+    Else
+    begin
+      WaterH := (Graphic.Height div 3);
+      WaterW := Round( WatermarkImage1.Width * (WaterH / WatermarkImage1.Height));
+    end;
+
+    WatermarkImage.NewImage(WaterW,WaterH+30,ifTrueColor, nil, 0, 0);
+    WatermarkImage.Canvas.Brush.Color := clWhite;
+    WatermarkImage.Canvas.FillRect(Rect(0,0,WatermarkImage.width,WatermarkImage.Height));
+
+    // Create the watermark transform
+
+
+    sourrect.Left := 0;
+    sourrect.Top := 0;
+    sourrect.Right := WatermarkImage1.Width;
+    sourrect.Bottom := WatermarkImage1.Height;
+    destrect.Left := 0;
+    destrect.Top := 0;
+    destrect.Right := WaterW;
+    destrect.Bottom := WaterH;
+    WatermarkImage.Canvas.CopyRect(destrect,WatermarkImage1.Canvas,sourrect);
+    WH := Graphic.Height div 2;
+    WW := Graphic.Width div 2;
+
+    WatermarkTransform:=TWatermarkTransform.Create;
+    try
+      // Set the watermark to use
+
+      WatermarkTransform.Watermark:=WatermarkImage;
+      // Select the position where place the watermark: centered !
+
+      WatermarkTransform.Position:=Point(WW -(WatermarkImage.Width div 2),
+                                        WH -(WatermarkImage.Height div 2));
+
+      //WatermarkTransform.Position:=Point((ImageScrollBox.DisplayedGraphic.Width-WatermarkImage.Width) div 2,
+        //                                 (ImageScrollBox.DisplayedGraphic.Height-WatermarkImage.Height) div 2);
+
+      IF Content <> '' Then
+      begin
+        WatermarkTransform.Watermark.Canvas.Font.Style := [fsBold];
+        WatermarkTransform.Watermark.Canvas.Font.Size := 36;
+        S := Content;
+        PW := WatermarkTransform.Watermark.Canvas.TextWidth(Content);
+        PH := WatermarkTransform.Watermark.Canvas.TextHeight(Content);
+        WatermarkTransform.Watermark.Canvas.TextOut((WatermarkTransform.Watermark.Width - PW) Div 2,WatermarkTransform.Watermark.Height-PH-10,Content);
+      end;
+
+      // Set the opacity %
+      WatermarkTransform.Opacity:=Opacity;
+
+      // Apply the watermark
+      WatermarkTransform.Apply(Graphic);
+      //ImageScrollBox.Redraw(False);
+      //ShowMessage('Watermark applied at image center with 25% opacity !');
+    finally
+     WatermarkTransform.Free;
+    end;
+  finally
+    WatermarkImage.Free;
+    WatermarkImage1.Free;
+   end;
+end;
+
+procedure Watermark1(Opacity:Byte;Content,Content1:String;Graphic:TDibGraphic);
+Var WatermarkTransform:TWatermarkTransform;
+    WatermarkImage:TDibGraphic;
+    WatermarkImage1:TDibGraphic;
+    WatermarkImage2:TDibGraphic;
+    destrect,sourRect : Trect;
+    WaterH,WaterW : Integer;
+    Text_H,Text_W : Integer;
+begin
+   // Allows user to select a file (the watermark)
+   // Create the graphics specific for the selected extension
+   if Content = '' then Exit;
+
+   WatermarkImage1:=TDibGraphic.Create;
+   WatermarkImage2:=TDibGraphic.Create;
+   WatermarkImage:=TDibGraphic.Create;
+   try
+    // Load the watermark
+    //WatermarkImage1.Assign(logoBmp);
+    Graphic.Canvas.Font.Size := 20;
+    Text_W := Graphic.Canvas.TextWidth(Content)+80;
+    Text_H := Graphic.Canvas.TextHeight(Content);
+    WaterW := Text_W;
+    WaterH := Text_W div 6;
+    WatermarkImage1.NewImage(WaterW,WaterH,ifTrueColor, nil, 0, 0);
+    WatermarkImage1.Canvas.Brush.Color := clWhite;
+    WatermarkImage1.Canvas.FillRect(Rect(0,0,WatermarkImage1.width,WatermarkImage1.Height));
+    WatermarkImage1.Canvas.Font.Size := 20;
+    WatermarkImage1.Canvas.Font.Style := [fsBold];
+    WatermarkImage1.Canvas.Font.Name := 'Times New Roman';
+    WatermarkImage1.Canvas.TextOut(1,WaterH div 2,Content);
+    WatermarkImage1.Canvas.TextOut(1,WaterH div 12,content1);
+    Rotate(WatermarkImage1,330);  //轉330度
+    WatermarkImage2.NewImage(WaterW,WaterH,ifTrueColor, nil, 0, 0);
+    WatermarkImage2.Canvas.Brush.Color := clWhite;
+    WatermarkImage2.Canvas.FillRect(Rect(0,0,WatermarkImage2.width,WatermarkImage2.Height));
+    WatermarkImage2.Canvas.Font.Size := 20;
+    WatermarkImage2.Canvas.Font.Style := [fsBold];
+    WatermarkImage2.Canvas.Font.Name := 'Times New Roman';
+    WatermarkImage2.Canvas.TextOut(1,WaterH div 2,Content);
+    WatermarkImage2.Canvas.TextOut(1,WaterH div 12,content1);
+    Rotate(WatermarkImage2,225);  //轉330度
+    WatermarkImage.NewImage(Graphic.Width,Graphic.Height,ifTrueColor, nil, 0, 0);
+    WatermarkImage.Canvas.Brush.Color := clWhite;
+    WatermarkImage.Canvas.FillRect(Rect(0,0,WatermarkImage.width,WatermarkImage.Height));
+    // Create the watermark transform
+    sourrect.Left := 0;
+    sourrect.Top := 0;
+    sourrect.Right := WatermarkImage1.Width;
+    sourrect.Bottom := WatermarkImage1.Height;
+    destrect.Left := 0;
+    destrect.Top := 0;
+    destrect.Right := WatermarkImage1.Width;
+    destrect.Bottom := WatermarkImage1.Height;
+    WatermarkImage.Canvas.CopyRect(destrect,WatermarkImage1.Canvas,sourrect);
+    sourrect.Left := 0;
+    sourrect.Top := 0;
+    sourrect.Right := WatermarkImage2.Width;
+    sourrect.Bottom := WatermarkImage2.Height;
+    destrect.Left := 0;
+    destrect.Top := WatermarkImage.Height-(WatermarkImage2.Height * 3 div 2);
+    destrect.Right := WatermarkImage2.Width;
+    destrect.Bottom := WatermarkImage.Height-WatermarkImage2.Height div 2;
+    WatermarkImage.Canvas.CopyRect(destrect,WatermarkImage2.Canvas,sourrect);
+    {destrect.Left := WatermarkImage.Width-WatermarkImage1.Width;
+    destrect.Top := WatermarkImage.Height-WatermarkImage1.Height;
+    destrect.Right := WatermarkImage.Width;
+    destrect.Bottom := WatermarkImage.Height;
+    WatermarkImage.Canvas.CopyRect(destrect,WatermarkImage1.Canvas,sourrect);
+     }
+
+
+
+    WatermarkTransform:=TWatermarkTransform.Create;
+    try
+      // Set the watermark to use
+
+      WatermarkTransform.Watermark:=WatermarkImage;
+      // Select the position where place the watermark: centered !
+
+      WatermarkTransform.Position:=Point(80,80);
+
+      //WatermarkTransform.Position:=Point((ImageScrollBox.DisplayedGraphic.Width-WatermarkImage.Width) div 2,
+        //                                 (ImageScrollBox.DisplayedGraphic.Height-WatermarkImage.Height) div 2);
+
+      // Set the opacity %
+      WatermarkTransform.Opacity:=Opacity;
+
+      // Apply the watermark
+      WatermarkTransform.Apply(Graphic);
+      //ImageScrollBox.Redraw(False);
+      //ShowMessage('Watermark applied at image center with 25% opacity !');
+    finally
+     WatermarkTransform.Free;
+    end;
+  finally
+    WatermarkImage.Free;
+    WatermarkImage1.Free;
+    WatermarkImage2.Free;
+   end;
+end;
+
+procedure Watermark1_Hong(Opacity:Byte;Content,Content1:String;Graphic:TDibGraphic;ImgH:Integer);
+Var WatermarkTransform:TWatermarkTransform;
+    WatermarkImage:TDibGraphic;
+    WatermarkImage1:TDibGraphic;
+    WatermarkImage2:TDibGraphic;
+    destrect,sourRect : Trect;
+    WaterH,WaterW : Integer;
+    Text_H,Text_W : Integer;
+    i,pre : Integer;
+    Zoompercent : Single;
+    Water_SP : Integer;
+    Constr : String;
+begin
+   // Allows user to select a file (the watermark)
+   // Create the graphics specific for the selected extension
+   if Content = '' then Exit;
+   Constr := Content;
+   if length(Content1) > length(Content) then
+     Constr := Content1;
+   //Showmessage(inttostr(ImgH)+#13+inttostr(Graphic.Height)+#13+inttostr(Graphic.XDotsPerInch));
+
+   Zoompercent := Graphic.Height/ImgH *100;
+   //Showmessage(floattostr(Zoompercent));
+   WatermarkImage1:=TDibGraphic.Create;
+   WatermarkImage2:=TDibGraphic.Create;
+   WatermarkImage:=TDibGraphic.Create;
+   try
+    // Load the watermark
+    //WatermarkImage1.Assign(logoBmp);
+    //showmessage(inttostr(Graphic.Width)+#13+inttostr(Graphic.Height));
+    Graphic.Canvas.Font.Style := [fsBold];
+    Graphic.Canvas.Font.Name := '標楷體';
+    Graphic.Canvas.Font.PixelsPerInch := Graphic.XDotsPerInch;
+    Graphic.Canvas.Font.Size := Round(32*(Graphic.XDotsPerInch/300)*Zoompercent/100);
+    {Pre := 16;
+    for i in [36,32,28,26,24,22,20,18,16,14,12,10,8,6] do
+    begin
+      Graphic.Canvas.Font.Size := i;
+      Text_W := Graphic.Canvas.TextWidth(Constr);
+      //Showmessage(inttostr(DGraphic.Canvas.Font.Size)+#13+inttostr(Text_W)+#13+inttostr(DGraphic.Width div 2));
+      if Text_W > ((Graphic.Width div 3) * 2) then
+      begin
+        Graphic.Canvas.Font.Size := Pre;
+        Break;
+      end;
+      Pre := i;
+    end;}
+    //Showmessage(inttostr(Graphic.Canvas.Font.Size));
+    Text_W := Graphic.Canvas.TextWidth(Constr)+Round(1.5/2.54*Graphic.XDotsPerInch*Zoompercent/100);
+    //Showmessage(inttostr(Graphic.Canvas.Font.Size)+#13+inttostr(Graphic.Width)+#13+inttostr(Text_W));
+    While Text_W > Graphic.Width do
+    begin
+      Graphic.Canvas.Font.Size := Graphic.Canvas.Font.Size-1;
+      Text_W := Graphic.Canvas.TextWidth(Constr)+Round(1.5/2.54*Graphic.XDotsPerInch*Zoompercent/100);
+      //Showmessage(inttostr(Graphic.Canvas.Font.Size)+#13+inttostr(Graphic.Width)+#13+inttostr(Text_W));
+    end;
+    //Showmessage(inttostr(Graphic.Canvas.Font.Size));
+
+    Text_H := Graphic.Canvas.TextHeight(Constr);
+    Water_SP := Round(0.4/2.54*Graphic.XDotsPerInch*Zoompercent/100);
+    WaterW := Text_W;
+    WaterH := Text_H*2+Water_SP;// div 6;
+    //Showmessage(inttostr(Text_W)+#13+inttostr(Text_H)+#13+inttostr(WaterH));
+
+    WatermarkImage1.NewImage(WaterW,WaterH,ifTrueColor, nil, Graphic.XDotsPerInch,Graphic.YDotsPerInch);
+    WatermarkImage1.Canvas.Brush.Color := clWhite;
+    WatermarkImage1.Canvas.FillRect(Rect(0,0,WatermarkImage1.width,WatermarkImage1.Height));
+    WatermarkImage1.Canvas.Font.PixelsPerInch := Graphic.XDotsPerInch;
+    WatermarkImage1.Canvas.Font.Size := Graphic.Canvas.Font.Size;
+    WatermarkImage1.Canvas.Font.Style := [fsBold];
+    WatermarkImage1.Canvas.Font.Name := '標楷體';
+    WatermarkImage1.Canvas.TextOut(1,1,Content);
+    WatermarkImage1.Canvas.TextOut(1,Text_H div 2+Water_SP,content1);
+    //Showmessage(inttostr(WatermarkImage1.Width)+#13+inttostr(WatermarkImage1.Height));
+    Rotate(WatermarkImage1,-30);  //轉330度
+    //Showmessage(inttostr(WatermarkImage1.Width)+#13+inttostr(WatermarkImage1.Height));
+    WatermarkImage2.NewImage(WaterW,WaterH,ifTrueColor, nil, 0, 0);
+    WatermarkImage2.Canvas.Brush.Color := clWhite;
+    WatermarkImage2.Canvas.FillRect(Rect(0,0,WatermarkImage2.width,WatermarkImage2.Height));
+    WatermarkImage2.Canvas.Font.PixelsPerInch := Graphic.XDotsPerInch;
+    WatermarkImage2.Canvas.Font.Size := Graphic.Canvas.Font.Size;
+    WatermarkImage2.Canvas.Font.Style := [fsBold];
+    WatermarkImage2.Canvas.Font.Name := '標楷體';
+    WatermarkImage2.Canvas.TextOut(1,1,Content);
+    WatermarkImage2.Canvas.TextOut(1,Text_H div 2+Water_SP,content1);
+    //WatermarkImage2.Canvas.TextOut(1,WaterH div 2,Content);
+    //WatermarkImage2.Canvas.TextOut(1,WaterH div 12,content1);
+    Rotate(WatermarkImage2,40);  //轉330度
+    WatermarkImage.NewImage(Graphic.Width,Graphic.Height,ifTrueColor, nil, 0, 0);
+    WatermarkImage.Canvas.Brush.Color := clWhite;
+    WatermarkImage.Canvas.FillRect(Rect(0,0,WatermarkImage.width,WatermarkImage.Height));
+
+    // Create the watermark transform
+    sourrect.Left := 0;
+    sourrect.Top := 0;
+    sourrect.Right := WatermarkImage1.Width;
+    sourrect.Bottom := WatermarkImage1.Height;
+    //showmessage(inttostr(Zoompercent)+#13+inttostr(Round(1/2.54*Graphic.XDotsPerInch*Zoompercent/100)));
+    destrect.Left := Round(3/2.54*Graphic.XDotsPerInch*Zoompercent/100);
+    destrect.Top :=  (WatermarkImage.Height Div 4)-(WatermarkImage1.Height div 2);
+    destrect.Right := destrect.Left+WatermarkImage1.Width;
+    destrect.Bottom := destrect.Top + WatermarkImage1.Height;
+    //Showmessage(inttostr(WatermarkImage.Height)+#13+inttostr(destrect.Top)+#13+inttostr(destrect.Bottom)+#13+inttostr(WatermarkImage1.Height));
+    WatermarkImage.Canvas.CopyRect(destrect,WatermarkImage1.Canvas,sourrect);
+    sourrect.Left := 0;
+    sourrect.Top := 0;
+    sourrect.Right := WatermarkImage2.Width;
+    sourrect.Bottom := WatermarkImage2.Height;
+    destrect.Left := Round(3/2.54*Graphic.XDotsPerInch*Zoompercent/100);
+    destrect.Top := ((WatermarkImage.Height div 4) * 3) -(WatermarkImage2.Height div 2);
+    destrect.Right := destrect.Left+WatermarkImage2.Width;
+    destrect.Bottom := destrect.Top+WatermarkImage2.Height;
+    WatermarkImage.Canvas.CopyRect(destrect,WatermarkImage2.Canvas,sourrect);
+    {destrect.Left := WatermarkImage.Width-WatermarkImage1.Width;
+    destrect.Top := WatermarkImage.Height-WatermarkImage1.Height;
+    destrect.Right := WatermarkImage.Width;
+    destrect.Bottom := WatermarkImage.Height;
+    WatermarkImage.Canvas.CopyRect(destrect,WatermarkImage1.Canvas,sourrect);
+     }
+
+
+
+    WatermarkTransform:=TWatermarkTransform.Create;
+    try
+      // Set the watermark to use
+
+      WatermarkTransform.Watermark:=WatermarkImage;
+      // Select the position where place the watermark: centered !
+
+      WatermarkTransform.Position:=Point(0,0);
+
+      //WatermarkTransform.Position:=Point((ImageScrollBox.DisplayedDGraphic.Width-WatermarkImage.Width) div 2,
+        //                                 (ImageScrollBox.DisplayedDGraphic.Height-WatermarkImage.Height) div 2);
+
+      // Set the opacity %
+      WatermarkTransform.Opacity:=Opacity;
+
+      // Apply the watermark
+      WatermarkTransform.Apply(Graphic);
+      //ImageScrollBox.Redraw(False);
+      //ShowMessage('Watermark applied at image center with 25% opacity !');
+    finally
+     WatermarkTransform.Free;
+    end;
+  finally
+    WatermarkImage.Free;
+    WatermarkImage1.Free;
+    WatermarkImage2.Free;
+   end;
+end;
+
+procedure Watermark1_Hong_New(Opacity:Byte;Content,Content1:String;Graphic,DisGraphic:TDibGraphic;ImgH:Integer); //自行產生文字330度印在左上右下
+Var WatermarkTransform:TWatermarkTransform;
+    WatermarkImage:TDibGraphic;
+    WatermarkImage1:TDibGraphic;
+    WatermarkImage2:TDibGraphic;
+    destrect,sourRect : Trect;
+    WaterH,WaterW : Integer;
+    Text_H,Text_W : Integer;
+    i,pre : Integer;
+    Zoompercent : Single;
+    Water_SP : Integer;
+    Constr : String;
+begin
+   // Allows user to select a file (the watermark)
+   // Create the graphics specific for the selected extension
+   if Content = '' then Exit;
+   Constr := Content;
+   if length(Content1) > length(Content) then
+     Constr := Content1;
+   //Showmessage(inttostr(ImgH)+#13+inttostr(Graphic.Height)+#13+inttostr(Graphic.XDotsPerInch));
+
+   Zoompercent := DisGraphic.Height/ImgH *100;
+   //Showmessage(floattostr(Zoompercent));
+   WatermarkImage1:=TDibGraphic.Create;
+   WatermarkImage2:=TDibGraphic.Create;
+   WatermarkImage:=TDibGraphic.Create;
+   try
+    // Load the watermark
+    //WatermarkImage1.Assign(logoBmp);
+    //showmessage(inttostr(Graphic.Width)+#13+inttostr(Graphic.Height));
+    Graphic.Canvas.Font.Style := [fsBold];
+    Graphic.Canvas.Font.Name := '標楷體';
+    Graphic.Canvas.Font.PixelsPerInch := Graphic.XDotsPerInch;
+    Graphic.Canvas.Font.Size := 16;
+
+    {Pre := 16;
+    for i in [36,32,28,26,24,22,20,18,16,14,12,10,8,6] do
+    begin
+      Graphic.Canvas.Font.Size := i;
+      Text_W := Graphic.Canvas.TextWidth(Constr);
+      //Showmessage(inttostr(DGraphic.Canvas.Font.Size)+#13+inttostr(Text_W)+#13+inttostr(DGraphic.Width div 2));
+      if Text_W > ((Graphic.Width div 3) * 2) then
+      begin
+        Graphic.Canvas.Font.Size := Pre;
+        Break;
+      end;
+      Pre := i;
+    end;}
+    //Showmessage(inttostr(DGraphic.Canvas.Font.Size));
+    Text_W := Graphic.Canvas.TextWidth(Constr)+Round(1.5/2.54*Graphic.XDotsPerInch);
+    //Showmessage(inttostr(Graphic.Canvas.Font.Size)+#13+inttostr(Graphic.Width)+#13+inttostr(Text_W));
+
+
+    Text_H := Graphic.Canvas.TextHeight(Constr);
+    Water_SP := Round(0.4/2.54*Graphic.XDotsPerInch*Zoompercent/100);
+    WaterW := Text_W;
+    WaterH := Text_H*2+Water_SP;// div 6;
+    //Showmessage(inttostr(Text_W)+#13+inttostr(Text_H)+#13+inttostr(WaterH));
+
+    WatermarkImage1.NewImage(WaterW,WaterH,ifTrueColor, nil, Graphic.XDotsPerInch,Graphic.YDotsPerInch);
+    WatermarkImage1.Canvas.Brush.Color := clWhite;
+    WatermarkImage1.Canvas.FillRect(Rect(0,0,WatermarkImage1.width,WatermarkImage1.Height));
+    WatermarkImage1.Canvas.Font.PixelsPerInch := Graphic.XDotsPerInch;
+    WatermarkImage1.Canvas.Font.Size := Graphic.Canvas.Font.Size;
+    WatermarkImage1.Canvas.Font.Style := [fsBold];
+    WatermarkImage1.Canvas.Font.Name := '標楷體';
+    WatermarkImage1.Canvas.TextOut(1,1,Content);
+    WatermarkImage1.Canvas.TextOut(1,Text_H div 2+Water_SP,content1);
+    //Showmessage(inttostr(WatermarkImage1.Width)+#13+inttostr(WatermarkImage1.Height));
+    Rotate(WatermarkImage1,-30);  //轉330度
+    //Showmessage(inttostr(WatermarkImage1.Width)+#13+inttostr(WatermarkImage1.Height));
+    WatermarkImage2.NewImage(WaterW,WaterH,ifTrueColor, nil, 0, 0);
+    WatermarkImage2.Canvas.Brush.Color := clWhite;
+    WatermarkImage2.Canvas.FillRect(Rect(0,0,WatermarkImage2.width,WatermarkImage2.Height));
+    WatermarkImage2.Canvas.Font.PixelsPerInch := Graphic.XDotsPerInch;
+    WatermarkImage2.Canvas.Font.Size := Graphic.Canvas.Font.Size;
+    WatermarkImage2.Canvas.Font.Style := [fsBold];
+    WatermarkImage2.Canvas.Font.Name := '標楷體';
+    WatermarkImage2.Canvas.TextOut(1,1,Content);
+    WatermarkImage2.Canvas.TextOut(1,Text_H div 2+Water_SP,content1);
+    //WatermarkImage2.Canvas.TextOut(1,WaterH div 2,Content);
+    //WatermarkImage2.Canvas.TextOut(1,WaterH div 12,content1);
+    Rotate(WatermarkImage2,-150);  //轉330度
+    WatermarkImage.NewImage(DisGraphic.Width,DisGraphic.Height,ifTrueColor, nil, 0, 0);
+    WatermarkImage.Canvas.Brush.Color := clWhite;
+    WatermarkImage.Canvas.FillRect(Rect(0,0,WatermarkImage.width,WatermarkImage.Height));
+
+    // Create the watermark transform
+    sourrect.Left := 0;
+    sourrect.Top := 0;
+    sourrect.Right := WatermarkImage1.Width;
+    sourrect.Bottom := WatermarkImage1.Height;
+    //showmessage(inttostr(Zoompercent)+#13+inttostr(Round(1/2.54*Graphic.XDotsPerInch*Zoompercent/100)));
+    destrect.Left := Round(1/2.54*Graphic.XDotsPerInch*Zoompercent/100);
+    destrect.Top :=  (WatermarkImage.Height Div 4)-(Round(WatermarkImage1.Height*Zoompercent/100) div 2);
+    destrect.Right := destrect.Left+Round(WatermarkImage1.Width*Zoompercent/100);
+    destrect.Bottom := destrect.Top + Round(WatermarkImage1.Height*Zoompercent/100);
+    //Showmessage(inttostr(WatermarkImage.Height)+#13+inttostr(destrect.Top)+#13+inttostr(destrect.Bottom)+#13+inttostr(WatermarkImage1.Height));
+    WatermarkImage.Canvas.CopyRect(destrect,WatermarkImage1.Canvas,sourrect);
+    sourrect.Left := 0;
+    sourrect.Top := 0;
+    sourrect.Right := WatermarkImage2.Width;
+    sourrect.Bottom := WatermarkImage2.Height;
+    destrect.Left := Round(1/2.54*Graphic.XDotsPerInch*Zoompercent/100);
+    destrect.Top := ((WatermarkImage.Height div 4) * 3) -(Round(WatermarkImage2.Height*Zoompercent/100) div 2);
+    destrect.Right := destrect.Left+Round(WatermarkImage2.Width*Zoompercent/100);
+    destrect.Bottom := destrect.Top+Round(WatermarkImage2.Height*Zoompercent/100);
+    WatermarkImage.Canvas.CopyRect(destrect,WatermarkImage2.Canvas,sourrect);
+    {destrect.Left := WatermarkImage.Width-WatermarkImage1.Width;
+    destrect.Top := WatermarkImage.Height-WatermarkImage1.Height;
+    destrect.Right := WatermarkImage.Width;
+    destrect.Bottom := WatermarkImage.Height;
+    WatermarkImage.Canvas.CopyRect(destrect,WatermarkImage1.Canvas,sourrect);
+     }
+
+
+
+    WatermarkTransform:=TWatermarkTransform.Create;
+    try
+      // Set the watermark to use
+
+      WatermarkTransform.Watermark:=WatermarkImage;
+      // Select the position where place the watermark: centered !
+
+      WatermarkTransform.Position:=Point(0,0);
+
+      //WatermarkTransform.Position:=Point((ImageScrollBox.DisplayedDGraphic.Width-WatermarkImage.Width) div 2,
+        //                                 (ImageScrollBox.DisplayedDGraphic.Height-WatermarkImage.Height) div 2);
+
+      // Set the opacity %
+      WatermarkTransform.Opacity:=Opacity;
+
+      // Apply the watermark
+      WatermarkTransform.Apply(DisGraphic);
+      //ImageScrollBox.Redraw(False);
+      //ShowMessage('Watermark applied at image center with 25% opacity !');
+    finally
+     WatermarkTransform.Free;
+    end;
+  finally
+    WatermarkImage.Free;
+    WatermarkImage1.Free;
+    WatermarkImage2.Free;
+   end;
+end;
+
+procedure Watermark2(logoBmp:TBitmap;Opacity:Byte;Content:String;Graphic:TDibGraphic);
+Var WatermarkTransform:TWatermarkTransform;
+    WatermarkImage:TDibGraphic;
+    WatermarkImage1:TDibGraphic;
+    S : String;
+    PW,PH : Integer;
+    x,y : Integer;
+    WH,WW : Integer;
+    destrect,sourRect : Trect;
+    WaterH,WaterW : Integer;
+begin
+   // Allows user to select a file (the watermark)
+   // Create the graphics specific for the selected extension
+   WatermarkImage1:=TDibGraphic.Create;
+   WatermarkImage:=TDibGraphic.Create;
+   try
+    // Load the watermark
+    WatermarkImage1.Assign(logoBmp);
+    IF (Graphic.Height > Graphic.Width) Then
+    begin
+      WaterW := Round((1.2 / 2.54) * Graphic.XDotsPerInch);
+      WaterH := Round((5 / 2.54) * Graphic.XDotsPerInch);
+      //WaterW := (Graphic.Width div 18);
+      //WaterH := Round( WatermarkImage1.Height * (WaterW / WatermarkImage1.Width));
+    end
+    Else
+    begin
+      WaterW := Round((1.2 / 2.54) * Graphic.XDotsPerInch);
+      WaterH := Round((5 / 2.54) * Graphic.XDotsPerInch);
+      //WaterH := (Graphic.Height div 18);
+      //WaterW := Round( WatermarkImage1.Width * (WaterH / WatermarkImage1.Height));
+    end;
+
+    WatermarkImage.NewImage(WaterW,WaterH+30,ifTrueColor, nil, 0, 0);
+    WatermarkImage.Canvas.Brush.Color := clWhite;
+    WatermarkImage.Canvas.FillRect(Rect(0,0,WatermarkImage.width,WatermarkImage.Height));
+
+    // Create the watermark transform
+
+
+    sourrect.Left := 0;
+    sourrect.Top := 0;
+    sourrect.Right := WatermarkImage1.Width;
+    sourrect.Bottom := WatermarkImage1.Height;
+    destrect.Left := 0;
+    destrect.Top := 0;
+    destrect.Right := WaterW;
+    destrect.Bottom := WaterH;
+    WatermarkImage.Canvas.CopyRect(destrect,WatermarkImage1.Canvas,sourrect);
+    WH := Graphic.Height div 2;
+    WW := Graphic.Width div 2;
+
+    WatermarkTransform:=TWatermarkTransform.Create;
+    try
+      // Set the watermark to use
+
+      WatermarkTransform.Watermark:=WatermarkImage;
+      // Select the position where place the watermark: centered !
+
+      {WatermarkTransform.Position:=Point(WW -(WatermarkImage.Width div 2),
+                                        WH -(WatermarkImage.Height div 2));}
+      WatermarkTransform.Position:=Point(20,20);
+
+      //WatermarkTransform.Position:=Point((ImageScrollBox.DisplayedGraphic.Width-WatermarkImage.Width) div 2,
+        //                                 (ImageScrollBox.DisplayedGraphic.Height-WatermarkImage.Height) div 2);
+
+      IF Content <> '' Then
+      begin
+        WatermarkTransform.Watermark.Canvas.Font.Style := [fsBold];
+        WatermarkTransform.Watermark.Canvas.Font.Size := 36;
+        S := Content;
+        PW := WatermarkTransform.Watermark.Canvas.TextWidth(Content);
+        PH := WatermarkTransform.Watermark.Canvas.TextHeight(Content);
+        WatermarkTransform.Watermark.Canvas.TextOut((WatermarkTransform.Watermark.Width - PW) Div 2,WatermarkTransform.Watermark.Height-PH-10,Content);
+      end;
+
+      // Set the opacity %
+      WatermarkTransform.Opacity:=Opacity;
+
+      // Apply the watermark
+      WatermarkTransform.Apply(Graphic);
+      //ImageScrollBox.Redraw(False);
+      //ShowMessage('Watermark applied at image center with 25% opacity !');
+    finally
+     WatermarkTransform.Free;
+    end;
+  finally
+    WatermarkImage.Free;
+    WatermarkImage1.Free;
+   end;
+end;
+
+Procedure FindPoint(Graphic:TDibGraphic;Var UpPointL,UpPointR,DownPointL:TPoint;Var FormWidth,FormHeight:Integer;Anchor:String);
+var
+  XDpi,YDpi : Integer;
+  XLen,XLen1,YLen : Integer;
+  LSeg,RSeg : Integer;
+  compsize : Integer;
+begin
+  XDpi := Graphic.XDotsPerInch;
+  YDpi := Graphic.YDotsPerInch;
+  XLen := Round(1 * XDpi);
+  XLen1 := Round(4 * XDpi);
+  YLen := Round(1 * XDpi);
+  LSeg := 1;//Round(0.1 / 2.54 * XDpi);
+  RSeg := 1;
+  compsize := Round(0.15/2.54 * XDpi);  //要找定位的長度
+  if Anchor <> 'NONE' then
+  begin
+
+    UpPointL := Checked_Start(Graphic,LSeg,LSeg,XLen,YLen ,compsize,1,Anchor);
+    IF ((UpPointL.X=0) and (UpPointL.Y=0)) Then
+      UpPointL := Checked_Start(Graphic,LSeg,LSeg,XLen1,YLen ,compsize,1,Anchor);
+
+    DownPointL := Checked_Start(Graphic,Lseg,Graphic.Height- Lseg,XLen,Graphic.Height-YLen ,compsize,2,Anchor); //ToY必須>=compsize
+    IF ((DownPointL.X=0) and (DownPointL.Y=Graphic.Height)) Then
+    begin
+      DownPointL := Checked_Start(Graphic,Lseg,Graphic.Height- Lseg,XLen1,Graphic.Height-YLen ,compsize,2,Anchor);
+    end;
+    UpPointR := Checked_Start(Graphic,Graphic.Width - Rseg,Rseg,Graphic.Width-XLen,YLen ,compsize,3,Anchor); //FromX必須>=compsize
+    FormWidth := UpPointR.X - UpPointL.X;
+    FormHeight := DownPointL.Y - UpPointL.Y;
+  end
+  Else
+  begin
+    UpPointL.X := 0;
+    UpPointL.Y := 0;
+    FormWidth := Graphic.Width;
+    FormHeight := Graphic.Height;
+  end;
+
+  {IF ((UpPointR.X=ImageScrollBox1.Graphic.Width)and(UpPointR.Y=0)) Then
+    UpPointR := Checked_Start(ISB_BW.Graphic,ImageScrollBox1.Graphic.Width - Rseg,Rseg,ImageScrollBox1.Graphic.Width-XLen1,YLen ,compsize,3,AnchorMode); //FromX必須>=compsize
+  }
+  //DownPointR := Checked_Start(ISB_BW.Graphic,ImageScrollBox1.Graphic.Width -Rseg,ImageScrollBox1.Graphic.Height- Rseg,ImageScrollBox1.Graphic.Width-XLen ,ImageScrollBox1.Graphic.Height-YLen ,compsize,4,AnchorMode); //FromX必須>=compsize
+
+end;
+
+Procedure FindPoint(Graphic:TDibGraphic;Var UpPointL,UpPointR,DownPointL:TPoint;Anchor:String);overload;
+var
+  XDpi,YDpi : Integer;
+  XLen,XLen1,YLen : Integer;
+  LSeg,RSeg : Integer;
+  compsize : Integer;
+begin
+  XDpi := Graphic.XDotsPerInch;
+  YDpi := Graphic.YDotsPerInch;
+  XLen := Round(1 * XDpi);
+  XLen1 := Round(4 * XDpi);
+  YLen := Round(1 * XDpi);
+  LSeg := 1;//Round(0.1 / 2.54 * XDpi);
+  RSeg := 1;
+  compsize := Round(0.15/2.54 * XDpi);  //要找定位的長度
+  UpPointL := Checked_Start(Graphic,LSeg,LSeg,XLen,YLen ,compsize,1,Anchor);
+  IF ((UpPointL.X=0) and (UpPointL.Y=0)) Then
+    UpPointL := Checked_Start(Graphic,LSeg,LSeg,XLen1,YLen ,compsize,1,Anchor);
+
+  DownPointL := Checked_Start(Graphic,Lseg,Graphic.Height- Lseg,XLen,Graphic.Height-YLen ,compsize,2,Anchor); //ToY必須>=compsize
+  IF ((DownPointL.X=0) and (DownPointL.Y=Graphic.Height)) Then
+  begin
+    DownPointL := Checked_Start(Graphic,Lseg,Graphic.Height- Lseg,XLen1,Graphic.Height-YLen ,compsize,2,Anchor);
+  end;
+  UpPointR := Checked_Start(Graphic,Graphic.Width - Rseg,Rseg,Graphic.Width-XLen,YLen ,compsize,3,Anchor); //FromX必須>=compsize
+end;
+
+function GetBlackSpots(Graphic:TDibGraphic;L, T, R, B, Ratio: Integer): WideString;
+var
+  S : TStringlist;
+  i : Integer;
+begin
+  Result := '';
+  IF Graphic.ImageFormat = ifBlackWhite Then
+  begin
+    S := TStringlist.Create;
+    try
+      DorwFindRect(Graphic,L,T,R,B,Ratio);
+      for i := 1 to BlackSpotsCount do
+      begin
+        S.Add(Format('%d,%d,%d,%d',[BlackSpots[i].Left,BlackSpots[i].Top,BlackSpots[i].Right,BlackSpots[i].Bottom ]));
+      end;
+    Result := S.Text;
+    Finally
+    S.Free;
+    end;
+  end;
+end;
+
+Procedure FindBlackPoint(Graphic:TDibGraphic;Var BlackPoint:Tpoint);
+var
+  Seg : Integer;
+  W,H : Integer;
+  BlackSpotList,SiteList : TStringlist;
+  i : Integer;
+  P : TPoint;
+begin
+  BlackPoint.X := 0;
+  BlackPoint.Y := 0;
+
+  IF Graphic.ImageFormat = ifBlackWhite Then
+  begin
+    BlackSpotList := TStringlist.Create;
+    SiteList := TStringlist.Create;
+    try
+
+      Seg := Round(1/2.54*Graphic.XDotsPerInch);  //1公分的邊
+      W := Graphic.Width;
+      H := Graphic.Height;
+      BlackSpotList.Text := GetBlackSpots(Graphic,W-Seg,0,W,H,80);
+
+      If BlackSpotList.Count > 0 Then
+      begin
+        BlackPoint := Str2Point(BlackSpotList.Strings[0]);
+      end;
+
+      For i:=1 to BlackSpotList.Count -1 do
+      begin
+        P := Str2Point(BlackSpotList.Strings[i]);
+        If (p.X+p.Y) > (BlackPoint.X +BlackPoint.Y) Then
+        begin
+          BlackPoint := p;
+        end;
+      end;
+    finally
+      BlackSpotList.Free;
+      SiteList.Free;
+    end;
+  end;
+
+end;
+
+Function Get_OMR(Graphic:TDibGraphic;iRect:Trect):integer; //取點數
+var i,n,x,y:integer;
+begin
+  i:=0;
+  n:=0;
+  for y := iRect.Top to iRect.Bottom -1 do
+    for x := iRect.Left to iRect.Right -1 do
+    begin
+      if Graphic.Canvas.Pixels[x,y] = clBlack Then
+         inc(n);
+    end;
+  result :=n;
+end;
+
+
+
+Function GetSelectRect(ISB:TImageScrollBox):TRect; //取出影像上的框選範圍
+var
+  Rt: TRect;
+  XDpi,YDpi : single;
+  ct : Integer;
+begin
+  Result := Rect(0,0,0,0);
+  XDpi:=ISB.Graphic.XDotsPerInch;
+  YDpi:=ISB.Graphic.YDotsPerInch;
+  if ISB.MouseHandler is TRubberBandMouseHandler then
+  begin
+    TRubberBandMouseHandler(ISB.MouseHandler).GetSourceSelection(Rt);
+    Result := Rt;
+  end;
+end;
+
+function GetSelectRect2String(ISB:TImageScrollBox;UpPointL:TPoint): WideString;
+var
+  rt2: trect;
+  XDpi,YDpi : single;
+  ct : Integer;
+  L,T,R,B : String;
+begin
+  //IF (X1 = X2) and  (Y1 = Y2) Then Exit;
+  XDpi:=ISB.Graphic.XDotsPerInch;
+  YDpi:=ISB.Graphic.YDotsPerInch;
+  if ISB.MouseHandler is TRubberBandMouseHandler then
+  begin
+    TRubberBandMouseHandler(ISB.MouseHandler).GetSourceSelection(rt2);
+    L := Format('%3.2f',[(rt2.Left - UpPointL.X) / Xdpi * 2.54 ]);
+    T := Format('%3.2f',[(rt2.Top - UpPointL.Y) / Xdpi * 2.54]);
+    R := Format('%3.2f',[(rt2.right - UpPointL.X) / Xdpi * 2.54]);
+    B := Format('%3.2f',[(rt2.bottom - UpPointL.Y)/ Xdpi * 2.54]);
+    Result := L+#13+T+#13+R+#13+B;
+  end;
+end;
+
+Procedure SetSelectRect(ISB:TImageScrollBox;iRect:TRect); //顯示出指定的框
+var
+  Rt : TRect;
+  XDpi,YDpi : single;
+  XZoom       : Single;
+  YZoom       : Single;
+begin
+  XDpi:=ISB.Graphic.XDotsPerInch;
+  YDpi:=ISB.Graphic.YDotsPerInch;
+  rt.Left :=Round(iRect.Left*ISB.ZoomPercent/100);
+  rt.Top :=Round(iRect.Top*ISB.ZoomPercent/100);
+  rt.Right :=Round(iRect.Right*ISB.ZoomPercent/100);
+  rt.Bottom :=Round(iRect.Bottom*ISB.ZoomPercent/100);
+  //20200217 加這段讓運算後可能不到1的變1,才能順利畫出框
+  if rt.Left = 0 then Rt.Left := 1;
+  if rt.Top = 0 then Rt.Top := 1;
+  if rt.Right = isb.DisplayedGraphic.Width then
+    rt.Right := isb.DisplayedGraphic.Width-1;
+  if rt.Bottom = isb.DisplayedGraphic.Height then
+    rt.Bottom := isb.DisplayedGraphic.Height-1;
+  //20200217 加這段讓運算後可能不到1的變1,才能順利畫出框
+
+
+  if ISB.MouseHandler is TRubberBandMouseHandler then
+  begin
+    TRubberBandMouseHandler(ISB.MouseHandler).setselectrect(rt);
+  end;
+  ISB.HorzScrollBar.Position := rt.Left;
+  ISB.VertScrollBar.Position := rt.Top-20;
+end;
+
+Procedure SetSelectRect_Original(ISB:TImageScrollBox;iRect:TRect); //顯示出指定的框(不縮放)
+var
+  Rt : TRect;
+  XDpi,YDpi : single;
+  XZoom       : Single;
+  YZoom       : Single;
+begin
+  XDpi:=ISB.Graphic.XDotsPerInch;
+  YDpi:=ISB.Graphic.YDotsPerInch;
+  rt.Left :=Round(iRect.Left);
+  rt.Top :=Round(iRect.Top);
+  rt.Right :=Round(iRect.Right);
+  rt.Bottom :=Round(iRect.Bottom);
+  if ISB.MouseHandler is TRubberBandMouseHandler then
+  begin
+    TRubberBandMouseHandler(ISB.MouseHandler).setselectrect(rt);
+  end;
+  ISB.HorzScrollBar.Position := rt.Left;
+  ISB.VertScrollBar.Position := rt.Top-20;
+end;
+
+Function GetSelectRect_Back(ISB:TImageScrollBox):TRect; //取出影像上的框選範圍(從右下回來)
+var
+  rt2: trect;
+  ct : Integer;
+  L1,T1,R1,B1 : String;
+begin
+  //IF (X1 = X2) and  (Y1 = Y2) Then Exit;
+  Result := Rect(0,0,0,0);
+  if ISB.MouseHandler is TRubberBandMouseHandler then
+  begin
+    TRubberBandMouseHandler(ISB.MouseHandler).GetSourceSelection(rt2);
+    rt2.Left := ISB.Graphic.Width - rt2.Left;
+    rt2.Top := ISB.Graphic.Height - rt2.Top;
+    rt2.Right := ISB.Graphic.Width - rt2.Right;
+    rt2.Bottom := ISB.Graphic.Height - rt2.Bottom;
+    Result := rt2;
+  end;
+end;
+
+function GetSelectRect_Black2String(ISB:TImageScrollBox;BlackPoint:TPoint): WideString;
+var
+  rt2: trect;
+  XDpi,YDpi : single;
+  ct : Integer;
+  L1,T1,R1,B1 : String;
+begin
+  //IF (X1 = X2) and  (Y1 = Y2) Then Exit;
+  Result := '';
+  XDpi:=ISB.Graphic.XDotsPerInch;
+  YDpi:=ISB.Graphic.YDotsPerInch;
+  if ISB.MouseHandler is TRubberBandMouseHandler then
+  begin
+    TRubberBandMouseHandler(ISB.MouseHandler).GetSourceSelection(rt2);
+    IF (BlackPoint.X > 0) and (BlackPoint.Y > 0) Then
+    begin
+      L1 := Format('%3.2f',[(BlackPoint.X - rt2.Left) / Xdpi * 2.54 ]);
+      T1 := Format('%3.2f',[(BlackPoint.Y - rt2.Top) / Xdpi * 2.54]);
+      R1 := Format('%3.2f',[(BlackPoint.X - rt2.right) / Xdpi * 2.54]);
+      B1 := Format('%3.2f',[(BlackPoint.Y - rt2.bottom)/ Xdpi * 2.54]);
+      Result := L1+#13+T1+#13+R1+#13+B1;
+    end;
+  end;
+end;
+
+
+Procedure ShowKeyinRect(ISB:TImageScrollBox;iRect:TRect); //顯示登打位置
+var
+  XZoom       : Single;
+  YZoom       : Single;
+  newZoom     : Single;
+  x1,x2,y1,y2 : Integer;
+  theRect : Trect;
+  Bmp : TBitmap;
+  FAnnotationCanvas : TCanvas;
+  i : Integer;
+begin
+  Therect:=  iRect;
+  XZoom   :=  ( (ISB.Width-20)/(Therect.Right - Therect.Left + 1) ) * 100;
+  YZoom   :=  ( (ISB.Height-20)/(Therect.Bottom - Therect.Top + 1+40)) * 100;
+
+  { limit the zoom value to 1000 % }
+  newZoom := MinFloat(MinFloat(XZoom,100), YZoom) ;
+  //NewZoom := ISB.ZoomPercent;
+  ISB.ZoomPercent := newZoom ;
+
+  ISB.HorzScrollBar.Position := SafeTrunc(Therect.Left* newZoom /100 );
+  ISB.VertScrollBar.Position := SafeTrunc((Therect.Top-20) * newZoom /100 );
+  //加入區域底色
+  x1 := SafeTrunc(Therect.Left* newZoom /100 )-ISB.HorzScrollBar.Position;
+  x2 := SafeTrunc(Therect.Right* newZoom /100 )-ISB.HorzScrollBar.Position;
+  y1 := SafeTrunc(Therect.Top* newZoom /100 )-ISB.VertScrollBar.Position;
+  y2 := SafeTrunc(Therect.bottom* newZoom /100 )-ISB.VertScrollBar.Position;
+  FAnnotationCanvas := TCanvas.Create;
+  FAnnotationCanvas.Handle := GetDC( ISB.Handle );
+  FAnnotationCanvas.Pen.Style := psSolid;
+  FAnnotationCanvas.Pen.Color := $00FEFAAD;  //&H80000005//65535;
+  FAnnotationCanvas.Pen.Width := 1;
+  FAnnotationCanvas.Pen.Mode := pmMask;
+
+  { Draw box on screen }
+  for i := y1 to y2 do begin
+    FAnnotationCanvas.MoveTo( x1, i );
+    FAnnotationCanvas.LineTo( x2, i );
+  end;
+  ReleaseDC(0,FAnnotationCanvas.Handle);
+  FAnnotationCanvas.Free;
+
+end;
+
+procedure ImageResize(Graphic:TDibGraphic;DesWidth,DesHeight:Integer);
+var
+  Transform    : TResizeTransform;
+  FUndoGraphic  : TDibGraphic;
+begin
+  FUndoGraphic  := TDibGraphic.Create;
+  Transform := TResizeTransform.Create;
+  try
+    Transform.Width      := DesWidth;
+    Transform.Height     := DesHeight;
+    //Transform.Interpolated := True;
+    //Transform.Filter := ifLanczos3;
+    FUndoGraphic.Assign(Graphic);
+    Transform.ApplyOnDest(FUndoGraphic,Graphic);
+  finally
+    Transform.Free;
+    FUndoGraphic.Free;
+  end;
+end;
+
+Procedure DpiResize(Graphic:TDibGraphic;DesDpi:Integer;CheckDpi:Boolean); //Dpi不足時放大Size
+Var
+  NewWidth : Integer;
+  NewHeight : Integer;
+begin
+  if CheckDpi then   //CUB 出現Dpi是1 要用這個才不會出現out of resource
+  begin
+    if (Graphic.XDotsPerInch > DesDpi) and (Graphic.YDotsPerInch> DesDpi) then
+    begin
+      NewWidth := Round(Graphic.Width * (DesDpi / Graphic.XDotsPerInch));
+      NewHeight := Round(Graphic.Height * (DesDpi / Graphic.YDotsPerInch));
+      Graphic.XDotsPerInch := DesDpi;
+      Graphic.YDotsPerInch := DesDpi;
+      ImageResize(Graphic,NewWidth,NewHeight);
+    end;
+  end
+  Else   //永豐傳真一定要用到這一段
+  begin
+    NewWidth := Round(Graphic.Width * (DesDpi / Graphic.XDotsPerInch));
+    NewHeight := Round(Graphic.Height * (DesDpi / Graphic.YDotsPerInch));
+    Graphic.XDotsPerInch := DesDpi;
+    Graphic.YDotsPerInch := DesDpi;
+    ImageResize(Graphic,NewWidth,NewHeight);
+  end;
+  
+end;
+
+Procedure DrawPointLine(ISB:TImageScrollBox;UpPointL,UpPointR,DownPointL:TPoint); //畫十字位置
+begin
+  ISB.DisplayedGraphic.Canvas.pen.Color := clGreen;
+  ISB.DisplayedGraphic.Canvas.Font.Size := 16;
+
+  //左上
+  ISB.DisplayedGraphic.Canvas.MoveTo(0,0);
+  ISB.DisplayedGraphic.Canvas.LineTo(Round(uppointL.X*ISB.ZoomPercent/100),Round(uppointL.y*ISB.ZoomPercent/100));
+
+  //左下
+  ISB.DisplayedGraphic.Canvas.MoveTo(0,Round(ISB.Graphic.Height*ISB.ZoomPercent/100));
+  ISB.DisplayedGraphic.Canvas.LineTo(Round(downpointL.X*ISB.ZoomPercent/100),Round(downpointL.y*ISB.ZoomPercent/100));
+
+  //右上
+  ISB.DisplayedGraphic.Canvas.MoveTo(Round(ISB.Graphic.Width*ISB.ZoomPercent/100),0);
+  ISB.DisplayedGraphic.Canvas.LineTo(Round(uppointR.X*ISB.ZoomPercent/100),Round(uppointR.y*ISB.ZoomPercent/100));
+
+  //ISB.DisplayedGraphic.Canvas.MoveTo(Round(ImageScrollBox1.Graphic.Width*ImageScrollBox1.ZoomPercent/100),Round(ImageScrollBox1.Graphic.Height*ImageScrollBox1.ZoomPercent/100));
+  //ISB.DisplayedGraphic.Canvas.LineTo(Round(downpointR.X*ImageScrollBox1.ZoomPercent/100),Round(downpointR.y*ImageScrollBox1.ZoomPercent/100));
+end;
+
+Procedure Color2BW_RTS(ISB:TImageScrollBox;Para1,Para2,Para3:Integer); //用RTS彩色轉黑白
+var
+  bmp:TBitmap;
+  Xdpi,Ydpi : Integer;
+begin
+  XDpi := ISB.Graphic.XDotsPerInch;
+  YDpi := ISB.Graphic.YDotsPerInch;
+  bmp := TBitmap.Create;
+  try
+    bmp.Assign(ISB.Graphic);
+    BmpGoVrs_Color(bmp,Para1,para2,para3);
+    ISB.Graphic.Assign(bmp);
+
+    ISB.Graphic.XDotsPerInch := XDpi;
+    ISB.Graphic.YDotsPerInch := YDpi;
+  Finally
+  bmp.Free;
+  end;
+end;
+
+Procedure Color2BW_RTS(ISB:TImageScrollBox;Para1,Para2,Para3:Integer;Part:Trect); Overload; //用RTS彩色轉黑白
+var
+  bmp:TBitmap;
+  Xdpi,Ydpi : Integer;
+begin
+  XDpi := ISB.Graphic.XDotsPerInch;
+  YDpi := ISB.Graphic.YDotsPerInch;
+  bmp := TBitmap.Create;
+  try
+    bmp.Assign(ISB.Graphic);
+    BmpGoVrs_Color(bmp,Para1,para2,para3);
+    ISB.Graphic.Assign(bmp);
+
+    ISB.Graphic.XDotsPerInch := XDpi;
+    ISB.Graphic.YDotsPerInch := YDpi;
+  Finally
+  bmp.Free;
+  end;
+end;
+
+Procedure Gray2BW_RTS(ISB:TImageScrollBox;Para1,Para2,Para3:Integer);
+var
+  bmp:TBitmap;
+  Xdpi,Ydpi : Integer;
+begin
+  XDpi := ISB.Graphic.XDotsPerInch;
+  YDpi := ISB.Graphic.YDotsPerInch;
+  bmp := TBitmap.Create;
+  try
+    if ISB.Graphic.ImageFormat <> ifGray256 then
+      Convertto256Gray(ISB.Graphic);
+
+    bmp.Assign(ISB.Graphic);
+    //bmp.PixelFormat := pf8bit;  //這樣接影像會拿到 24bit
+    if bmp.PixelFormat = pf8bit then
+      BmpGoVrs(bmp,Para1,para2,para3);
+    if bmp.PixelFormat  = pf24bit then
+      BmpGoVrs_Color(bmp,Para1,para2,para3);
+    ISB.Graphic.Assign(bmp);
+
+
+    ISB.Graphic.XDotsPerInch := XDpi;
+    ISB.Graphic.YDotsPerInch := YDpi;
+  Finally
+  bmp.Free;
+  end;
+end;
+
+Procedure Gray2BW_RTS(ISB:TImageScrollBox;Para1,Para2,Para3:Integer;Part:Trect); Overload; //用RTS灰階轉黑白
+var
+  bmp:TBitmap;
+  Xdpi,Ydpi : Integer;
+begin
+  XDpi := ISB.Graphic.XDotsPerInch;
+  YDpi := ISB.Graphic.YDotsPerInch;
+  bmp := TBitmap.Create;
+  try
+
+    bmp.Assign(ISB.Graphic);
+    bmp.PixelFormat := pf8bit;
+    BmpGoVrs(bmp,Para1,para2,para3,Part);
+    ISB.Graphic.Assign(bmp);
+
+
+    ISB.Graphic.XDotsPerInch := XDpi;
+    ISB.Graphic.YDotsPerInch := YDpi;
+  Finally
+  bmp.Free;
+  end;
+end;
+
+procedure Emboss(ISB:TImageScrollBox);
+var
+    Transform : TEmbossTransform;
+    FUndoGraphic : TDibGraphic;
+begin
+    FUndoGraphic := TDibGraphic.Create;
+    FUndoGraphic.Assign(ISB.Graphic);
+    Transform := TEmbossTransform.Create;
+    try
+        Transform.ApplyOnDest(FUndoGraphic, ISB.Graphic);
+    finally
+        Transform.Free;
+        FUndoGraphic.Free;
+    end;
+    //ISB.Redraw(True);
+end;
+
+Procedure BrightnessImg(ISB:TImageScrollBox;Precent:Integer); //調整亮度
+var
+    Transform : TBrightnessTransform;
+    FUndoGraphic : TDibGraphic;
+begin
+    FUndoGraphic := TDibGraphic.Create;
+    FUndoGraphic.Assign(ISB.Graphic);
+    Transform := TBrightnessTransform.Create;
+    try
+        Transform.Percent    := Precent;
+        Transform.ApplyOnDest(FUndoGraphic, ISB.Graphic);
+    finally
+        Transform.Free;
+        FUndoGraphic.Free;
+    end;
+    //ImageScrollBox.Redraw(True);
+end;
+
+Procedure ConvertToBW(Graphic : TDibGraphic); //轉成黑白
+var
+    Transform  : TImageFormatTransform;
+    FUndoGraphic : TDibGraphic;
+begin
+  Transform := TImageFormatTransform.Create;
+  FUndoGraphic := TDibGraphic.Create;
+  try
+    FUndoGraphic.Assign(Graphic);
+    Transform.ImageFormat := ifBlackWhite;
+    Transform.Quantize    := True;
+    Transform.Dither      := False;
+    Transform.ApplyOnDest(FUndoGraphic, Graphic);
+  finally
+    Transform.Free;
+    FUndoGraphic.Free;
+  end;
+end;
+
+Procedure ConvertTo256Gray(Graphic : TDibGraphic); //轉成256灰階
+var
+    Transform  : TImageFormatTransform;
+    FUndoGraphic : TDibGraphic;
+begin
+  Transform := TImageFormatTransform.Create;
+  FUndoGraphic := TDibGraphic.Create;
+  try
+    FUndoGraphic.Assign(Graphic);
+    Transform.ImageFormat := ifGray256;
+    Transform.Quantize    := True;
+    Transform.Dither      := False;
+    Transform.ApplyOnDest(FUndoGraphic, Graphic);
+  finally
+    Transform.Free;
+    FUndoGraphic.Free;
+  end;
+end;
+
+Procedure ClearLine(Graphic : TDibGraphic;bt:Integer); //清影像上的線條
+Var
+  GraphicA   : TTiffGraphic;
+  i:integer;
+begin
+  GraphicA := TTiffGraphic.create;
+  Try
+    GraphicA.Assign(Graphic);
+
+    For i:=8 to GraphicA.height-8 do
+         MpsClearLineV(Graphic, GraphicA , i, 1,GraphicA.Width-1,bt );
+
+     For i:=8 to GraphicA.Width-8 do
+         MpsClearLineH(Graphic, GraphicA , i, 1,GraphicA.Height-1,bt );
+    Graphic.Assign(GraphicA);
+  Finally
+  GraphicA.Free;
+  end;
+
+end;
+
+procedure CropImg(Graphic : TDibGraphic;iRect:TRect);
+var
+  Transform : TCropTransform;
+  FUndoGraphic : TDibGraphic;
+begin
+  FUndoGraphic := TDibGraphic.Create;
+  FUndoGraphic.Assign(Graphic);
+  Transform := TCropTransform.Create;
+  Transform.CropMode :=  cmExtractRect;
+  try
+      Transform.Left   := iRect.Left;
+      Transform.Right  := iRect.Right;
+      Transform.Top    := iRect.Top;
+      Transform.Bottom := iRect.Bottom;
+
+      Transform.ApplyOnDest(FUndoGraphic, Graphic);
+  finally
+      Transform.Free;
+      FUndoGraphic.Free;
+  end;
+end;
+
+Function GetPosAngle(UpL,DownL,UpR:TPoint):Single; //取二直線夾角角度
+var
+  angle1,angle2 : Single;
+  Wseg,Lseg : Integer;
+begin
+  Wseg := DownL.Y - UpL.Y;
+  Lseg := UpL.X - DownL.X;
+  Angle1 := (Arctan(Lseg/Wseg)*180/pi);
+
+  Wseg := UpL.Y - UpR.Y;
+  Lseg := UpR.X - UpL.X;
+  Angle2 := (Arctan(Wseg/Lseg)*180/pi);
+  Result := 90 +(Angle1)+(Angle2);
+end;
+
+function CheckSize(ISB:TImageScrollBox;UpL,UpR,DownL:TPoint;DefWidth,DefHeight:String): WideString;  //檢查Size並縮放
+var
+  NowW,NowH : Integer;
+  DefW,DefH : Integer;
+  SizeW,SizeH : Integer;
+  ReSizeW,ReSizeH : Integer;
+  XDpi,YDpi : Integer;
+begin
+  Result := '';
+  XDpi := ISB.Graphic.XDotsPerInch;
+  YDpi := ISB.Graphic.YDotsPerInch;
+  DefW := Round(strtofloat(DefWidth)/2.54*XDpi);
+  DefH := Round(strtofloat(DefHeight)/2.54*XDpi);
+  SizeW := ISB.Graphic.Width;
+  SizeH :=ISB.Graphic.Height;
+  IF (DefW > 0) and (DefH > 0) and ((GetPosAngle(UpL,DownL,UpR) > 89) and (GetPosAngle(UpL,DownL,UpR) < 91)) Then
+  begin
+    NowW := UpR.X - UpL.X;
+    NowH := DownL.Y - UpL.Y;
+    If (NowW <> ISB.Graphic.Width) and (NowH <> ISB.Graphic.Height) and ((NowW <> DefW) or (NowH <> DefH)) then
+    begin
+      ReSizeW := Round(ISB.Graphic.Width * DefW / NowW);
+      ReSizeH := Round(ISB.Graphic.Height * DefH /NowH);
+      ImageResize(ISB.Graphic,ReSizeW,ReSizeH);
+      ISB.Redraw(True);
+      Result := '原長'+inttostr(SizeH)+',原寬'+inttostr(SizeW)+',長變動'+inttostr(ReSizeH)+',寬變動'+inttostr(ReSizeW);
+    end;
+  end;
+end;
+
+Function GetPixBW( srcGraphic : TDibGraphic; x,y:integer ):integer;
+{******************************************************************************}
+{ 取點的顏色  要用黑白的                }
+{******************************************************************************}
+var
+
+  pSrcByte : ^Byte;
+  srcBit : Byte;
+
+
+begin
+
+  result := 1;
+  pSrcByte := Addr( srcGraphic.ScanLine[ y ] ^ [ x div 8 ] );
+  srcBit := $80 shr ( x mod 8 );
+
+  result := (pSrcByte^ and srcBit);
+  if  result > 0 Then  result := 0
+  else result := 1;
+
+end;
+
+Procedure BMPConverJpg(Source,SaveFileName:STring); //Bmp轉jpeg
+var
+  ConvertJpg :TTiffGraphic;
+  BMP : TBitMap ;
+begin
+  ConvertJpg:=TTiffGraphic.Create;
+  BMP :=TBitmap.Create;
+  try
+    BMP.LoadFromFile(source);
+    ConvertJpg.Assign(BMP);
+    ConvertJpg.Compression := tcNone;
+    ConvertJpg.SaveToFile(SaveFileName);
+  finally
+  convertjpg.Free;
+  Bmp.Free;
+  end;
+end;
+
+Procedure BWTif2Jpg(Graphic:TDibGraphic); //黑白Tif轉彩色jpg
+var
+  JpgGraphic  : TJpegGraphic;
+  FUndoGraphic       : TDibGraphic;
+  Transform : TImageFormatTransform;
+begin
+  JpgGraphic := TJpegGraphic.Create;
+  FUndoGraphic := TDibGraphic.Create;
+  FUndoGraphic.Assign(Graphic);
+  Transform := TImageFormatTransform.Create;
+  try
+    Transform.ImageFormat := ifTrueColor;
+    Transform.ApplyOnDest(FUndoGraphic, Graphic);
+  finally
+    Transform.Free;
+
+  end;
+  FUndoGraphic.Free;
+end;
+
+Procedure Convert2Jpg(Graphic:TDibGraphic); //黑白Tif轉彩色jpg
+var
+  FUndoGraphic       : TDibGraphic;
+  Transform : TImageFormatTransform;
+begin
+  FUndoGraphic := TDibGraphic.Create;
+  FUndoGraphic.Assign(Graphic);
+  Transform := TImageFormatTransform.Create;
+  try
+    Transform.ImageFormat := ifTrueColor;
+    Transform.ApplyOnDest(FUndoGraphic, Graphic);
+  finally
+    Transform.Free;
+
+  end;
+  FUndoGraphic.Free;
+end;
+
+Procedure FieldMask(ISB:TImageScrollBox;SiteList,Mode: WideString;UpPointL:TPoint); //遮罩 Mode:mark mask
+var
+  i,Dpi : integer;
+  Site_List,SiteStr : TStringlist;
+  L,T,R,B :String;
+  TB,LR : Integer;
+  Ann : String;
+  FixB : integer;
+begin
+  ISB.AlwaysShowAnnotations:= false;
+  ISB.MouseMode := mmuser;
+  ISB.MouseMode := mmselect;
+  Dpi := ISB.Graphic.XDotsPerInch;
+  FixB := Round(1/2.54*Dpi);
+  Site_List := TStringlist.Create;
+  SiteStr := TStringlist.Create;
+  try
+    Ann := '';
+    Site_List.Text:=SiteList;
+    For i := 0 to Site_List.Count -1 do
+    begin
+      SiteStr.CommaText := Site_List.Strings[i];
+      L := inttostr(Round(Strtofloat(SiteStr[0])/2.54*Dpi)+UpPointL.x);
+      T := inttostr(Round(Strtofloat(SiteStr[1])/2.54*Dpi)+UpPointL.y);
+      R := inttostr(Round(Strtofloat(SiteStr[2])/2.54*Dpi)+UpPointL.x);
+      B := inttostr(Round(Strtofloat(SiteStr[3])/2.54*Dpi)+UpPointL.y);
+      TB := strtoint(B) - strtoint(T);
+      LR := strtoint(R) - strtoint(L);
+
+      If strtoint(L) < 0 then    //因為十字損壞,抓不到正確的位置,另外做判斷
+      begin
+        L := '0';
+        R := inttostr(LR);
+      end;
+      if strtoint(T) < 0 then
+      begin
+        T := '0';
+        B := inttostr(TB);
+      end;
+      if strtoint(R) > ISB.Graphic.Width then
+      begin
+        R := inttostr(ISB.Graphic.Width);
+        L := inttostr(ISB.Graphic.Width-LR);
+      end;
+      if strtoint(B) > ISB.Graphic.Height then
+      begin
+        B := inttostr(ISB.Graphic.Height-FixB);
+        T := inttostr(ISB.Graphic.Height-FixB-TB);
+      end;
+
+      if Mode = 'Mask' then
+        Ann := Ann+'(2)('+L+')('+T+')('+R+')('+B+')(1)($FFFFFF)(0)(1)(4)'
+      Else if Mode = 'Mark' Then
+        Ann := Ann+'(2)('+L+')('+T+')('+R+')('+B+')(1)($00FEFAAD)(1)(1)(4)'
+    end;
+    If Ann <> '' Then
+      Ann := '('+inttostr(Site_List.Count)+')'+Ann;
+    ISB.Annotations := Ann;
+    If Ann <> '' Then
+      ISB.AlwaysShowAnnotations:= true;
+
+  Finally
+  Site_List.Free;
+  SiteStr.Free;
+  end;
+end;
+
+procedure SaveAnnotation(ISB:TImageScrollBox;FileName: WideString); //遮罩存檔
+Var
+  iISB : TImageScrollBox;
+begin
+  iISB := TImageScrollBox.Create(nil);
+  iISB.Graphic := ISB.Graphic;
+  iISB.Annotations := ISB.Annotations;
+  iISB.AlwaysShowAnnotations := True;
+  iISB.MouseMode := mmAnnotate;
+  iISB.BurnAnnotations;
+  ConvertToBW(iISB.Graphic);
+  iISB.SaveToFile(FileName);
+  iISB.Free;
+end;
+
+Procedure FilterColor(SoISB,DeISB:TImageScrollBox;Ration:Integer); //濾掉顏色 留黑白
+var
+  x,y : integer;
+  xrgb : Trgb;
+begin
+  DeISB.Graphic.NewImage(SoISB.Graphic.Width,SoISB.Graphic.Height,ifTrueColor, SoISB.Graphic.PalettePtr ,SoISB.Graphic.XDotsPerInch,SoISB.Graphic.YDotsPerInch   );
+  For y:= 0 to SoISB.Graphic.Height -1 do
+    for x:=0 to SoISB.Graphic.Width -1 do begin
+        xrgb := SoISB.Graphic.RGB[x,y];
+
+        if (xrgb.Red > Ration ) or (xrgb.Green > Ration) or (xrgb.Blue > Ration)  then begin
+
+                xrgb.Red   := 255;
+                xrgb.Green := 255;
+                xrgb.Blue  := 255;
+                DeISB.Graphic.RGB[x,y] := xrgb;
+                //ImageScrollBox3.Graphic.RGB[x,y] := ImageScrollBox2.Graphic.RGB[x,y];
+                end {else begin
+
+                xrgb.Red    := 255;
+                xrgb.Green  := 255;
+                xrgb.Blue   := 255;
+                ImageScrollBox3.Graphic.RGB[x,y] := xrgb;
+                end;}
+
+        end;
+
+  DeISB.Redraw(True);
+
+end;
+
+procedure JpgReSize_Exif(Maxlength,Quality:integer;OldFile,NewFile:String;WaterGraphic:TGraphic;PrintDate:Boolean); //照片縮放包含Exif
+var
+  ImgData:TImgData;
+  Orig,Smaller:tjpegimage;
+  buffer:tbitmap;
+  IH,IW,TH,TL : Integer;
+begin
+  IH := 0;
+  if WaterGraphic <> nil then
+  begin
+    IW := 80;
+    IH := Round(WaterGraphic.Height*IW/WaterGraphic.Width);
+  end;
+  TH := IH + 5;
+  TL := 5;
+  Buffer := tbitmap.Create;
+  Orig := tjpegImage.Create;
+  Smaller := tjpegimage.create;
+  ImgData := TimgData.Create;
+  try
+    //Orig.LoadFromFile(ExtractFilepath(ImgData.Filename)+'\222.jpg');
+    ImgData.BuildList := GenAll;  // on by default anyway
+    ImgData.ProcessFile(OldFile);
+
+    Orig.LoadFromFile(ImgData.Filename);
+    Orig.DIBNeeded;
+    Buffer.PixelFormat := pf24bit;
+    IF (Orig.Width >= Orig.Height) and (Orig.Width > MaxLength) Then
+    begin
+      Buffer.Width := MaxLength;
+      Buffer.Height := Round(Orig.Height * MaxLength / Orig.Width);
+    end
+    Else IF (Orig.Height > Orig.Width) and (Orig.Width > MaxLength) Then
+    begin
+      Buffer.Height := MaxLength;
+      Buffer.Width := Round(Orig.Width * MaxLength / Orig.Height);
+    end
+    Else
+    begin
+      Buffer.Height :=  Orig.Height;
+      Buffer.Width := Orig.Width;
+    end;
+    // Simple resize
+    Buffer.Canvas.StretchDraw(rect(0,0,Buffer.Width,Buffer.Height),Orig);
+    Buffer.Canvas.CopyMode := SRCAND;
+    if WaterGraphic <> nil then
+    begin
+      WaterGraphic.Transparent := True;
+      Buffer.Canvas.StretchDraw(Rect(0,0,IW,IH),WaterGraphic);
+    end;
+    //image1.Picture.Graphic.Transparent := True;
+    //Buffer.Canvas.StretchDraw(Rect(0,0,IW,IH),image1.Picture.Graphic);
+    IF PrintDate and ImgData.HasExif then
+    begin
+      Buffer.Canvas.Font.Size := 16;
+      Buffer.Canvas.Font.Color := clRed;
+      Buffer.Canvas.Pen.Mode := pmMerge;
+      Buffer.Canvas.Pen.Style  := psClear;
+      Buffer.Canvas.Brush.Style := bsClear;
+      Buffer.Canvas.TextOut(TL,TH,imgdata.ExifObj.DateTime);
+    end;
+
+    Smaller.Assign(Buffer);
+    Smaller.CompressionQuality := Quality; //75;
+    Smaller.Compress;
+    IF ImgData.HasExif then
+    begin
+      imgdata.WriteEXIFJpeg(Smaller,NewFile);
+    end
+    Else
+    begin
+      Smaller.SaveToFile(NewFile);
+    end;
+  finally // Cleanup
+    Buffer.free;
+    Orig.Free;
+    SMaller.Free;
+    ImgData.Free;
+  end;
+end;
+
+Function GetExif_CaptureDateTime(FileName : String):String; //取出檔案裡的Exif拍攝日期
+var
+  ImgData:TImgData;
+begin
+  Result := '';
+  ImgData := TimgData.Create;
+  try
+    ImgData.BuildList := GenAll;  // on by default anyway
+    ImgData.ProcessFile(FileName);
+    if ImgData.HasExif then
+      Result := ImgData.ExifObj.DateTime;
+  finally
+  ImgData.Free;
+  end;
+end;
+
+procedure  SetKeyinRect_New( ISB:TImageScrollBox; SiteStr, SiteStr_Black,FormHeight: String; UpPointL,UpPointR:TPoint);
+var Rt:Trect;
+  XDpi,YDpi : single;
+  x1,y1,x2,y2 : Integer;
+  XZoom       : Single;
+  YZoom       : Single;
+  newZoom     : Single;
+  theRect,ckRect : Trect;
+  Bmp : TBitmap;
+  FAnnotationCanvas : TCanvas;
+  i : Integer;
+  L,T,R,B : String;
+  L1,T1,R1,B1 : String;
+  S,S1 : TStringlist;
+  FormH : Integer;
+  IngronDis : Integer;
+begin
+  S := TStringlist.Create;
+  S1 := TStringlist.Create;
+  try
+    S.CommaText := Sitestr;
+    L := S.Strings[0];
+    T := S.Strings[1];
+    R := S.Strings[2];
+    B := S.Strings[3];
+    If SiteStr_Black <> '' Then
+    begin
+      S1.CommaText := SiteStr_Black;
+      L1 := S1.Strings[0];
+      T1 := S1.Strings[1];
+      R1 := S1.Strings[2];
+      B1 := S1.Strings[3];
+    end;
+  finally
+  S.Free;
+  end;
+  //If ISB.FileName = '' Then Exit;
+  If (ISB.Hint = '') and (ISB.FileName = '') Then Exit;  //因玉山影像放在Memory裡需使用 hint 來記檔名
+  XDpi:=ISB.Graphic.XDotsPerInch;
+  YDpi:=ISB.Graphic.YDotsPerInch;
+   IngronDis := Round(0.8 /2.54 * Xdpi);  //內容與十字最少要有的距離  先訂1公分
+  ISB.Refresh;
+  If FormHeight <> '' Then
+    FormH := Round(strtoFloat(FormHeight)/2.54*Xdpi)+UpPointL.Y
+  Else
+    FormH := 0;
+  //Therect:=Rect(Round(strtoFloat(L)/2.54*Xdpi)+UpPointL.X,Round(strtoFloat(T)/2.54*Xdpi)+UpPointL.Y,Round(strtoFloat(R)/2.54*Xdpi)+UpPointL.X,Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y);
+  //ckRect :=Rect(Round(strtoFloat(L)/2.54*Xdpi)+UpPointL.X-50,Round(strtoFloat(T)/2.54*Xdpi)+UpPointL.Y,Round(strtoFloat(R)/2.54*Xdpi)+UpPointL.X+50,Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y);
+  ckRect :=Rect(UpPointL.X,Round(strtoFloat(T)/2.54*Xdpi)+UpPointL.Y+5,UpPointR.X,Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y);
+  //showmessage(inttostr(ckrect.Left)+#13+inttostr(ckrect.Top)+#13+inttostr(ckrect.Right)+#13+inttostr(ckrect.Bottom)+#13+inttostr(Get_OMR(ckRect,ImageScrollBox1.Graphic)));
+
+  //IF (BlackPoint.X >0) and (BlackPoint.Y >0) and (SiteStr_Black <>'') and (FormH > 0) and ((Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y+IngronDis >= FormH) or (Get_OMR(ckRect,ImageScrollBox1.Graphic)<100))   {(Round(strtoFloat(T)/2.54*Xdpi) >= (9.3*Xdpi))} Then
+  //begin
+    //Therect:=Rect(BlackPoint.X-Round(strtoFloat(L1)/2.54*Xdpi),BlackPoint.Y -Round(strtoFloat(T1)/2.54*Xdpi),BlackPoint.X-Round(strtoFloat(R1)/2.54*Xdpi),BlackPoint.Y-Round(strtoFloat(B1)/2.54*Xdpi));
+    //Showmessage(inttostr(BlackPoint.X)+#13+inttostr(BlackPoint.Y)+#13+inttostr(Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y)+'-->'+inttostr(IngronDis)+'-->'+inttostr(FormH)+#13+inttostr(Get_OMR(ckRect,ImageScrollBox1.Graphic)));
+  {end
+  else
+  begin }
+    Therect:=Rect(Round(strtoFloat(L)/2.54*Xdpi)+UpPointL.X,Round(strtoFloat(T)/2.54*Xdpi)+UpPointL.Y,Round(strtoFloat(R)/2.54*Xdpi)+UpPointL.X,Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y);
+  //end;
+  XZoom   :=  ( (ISB.Width-20)/(Therect.Right - Therect.Left + 0.3*XDpi) ) * 100;
+  YZoom   :=  ( (ISB.Height-20)/(Therect.Bottom - Therect.Top + 0.3*YDpi)) * 100;
+
+  { limit the zoom value to 1000 % }
+  newZoom := MinFloat(MinFloat(XZoom,100), YZoom) ;
+  ISB.ZoomPercent := newZoom ;
+
+
+  ISB.HorzScrollBar.Position := SafeTrunc(Therect.Left* newZoom /100 )-SafeTrunc(0.3*XDpi* newZoom /100);
+  ISB.VertScrollBar.Position := SafeTrunc((Therect.Top) * newZoom /100 )-SafeTrunc(0.2*YDpi* newZoom /100);
+  //加入區域底色
+  x1 := SafeTrunc(Therect.Left* newZoom /100 )-ISB.HorzScrollBar.Position;
+  x2 := SafeTrunc(Therect.Right* newZoom /100 )-ISB.HorzScrollBar.Position;
+  y1 := SafeTrunc(Therect.Top* newZoom /100 )-ISB.VertScrollBar.Position;
+  y2 := SafeTrunc(Therect.bottom* newZoom /100 )-ISB.VertScrollBar.Position;
+  //Application.ProcessMessages;   //當元件時不可亂用這個指令
+  ISB.Refresh;
+  FAnnotationCanvas := TCanvas.Create;
+  FAnnotationCanvas.Handle := GetDC( ISB.Handle );
+  FAnnotationCanvas.Pen.Style := psSolid;
+  FAnnotationCanvas.Pen.Color := $00FEFAAD;  //&H80000005//65535;
+  FAnnotationCanvas.Pen.Width := 1;
+  FAnnotationCanvas.Pen.Mode := pmMask;
+
+  { Draw box on screen }
+  for i := y1 to y2 do begin
+    FAnnotationCanvas.MoveTo( x1, i );
+    FAnnotationCanvas.LineTo( x2, i );
+  end;
+  ReleaseDC(0,FAnnotationCanvas.Handle);
+  FAnnotationCanvas.Free;
+
+end;
+
+procedure SetKeyinRect_New( ISB:TImageScrollBox; SiteStr, SiteStr_Black,FormHeight: String; UpPointL,UpPointR:TPoint;SP:TShape); overload;
+var Rt:Trect;
+  XDpi,YDpi : single;
+  x1,y1,x2,y2 : Integer;
+  XZoom       : Single;
+  YZoom       : Single;
+  newZoom     : Single;
+  theRect,ckRect : Trect;
+  Bmp : TBitmap;
+  FAnnotationCanvas : TCanvas;
+  i : Integer;
+  L,T,R,B : String;
+  L1,T1,R1,B1 : String;
+  S,S1 : TStringlist;
+  FormH : Integer;
+  IngronDis : Integer;
+begin
+
+  S := TStringlist.Create;
+  S1 := TStringlist.Create;
+  try
+    S.CommaText := Sitestr;
+    L := S.Strings[0];
+    T := S.Strings[1];
+    R := S.Strings[2];
+    B := S.Strings[3];
+    If SiteStr_Black <> '' Then
+    begin
+      S1.CommaText := SiteStr_Black;
+      L1 := S1.Strings[0];
+      T1 := S1.Strings[1];
+      R1 := S1.Strings[2];
+      B1 := S1.Strings[3];
+    end;
+  finally
+  S.Free;
+  end;
+  //If ISB.FileName = '' Then Exit;
+  if (ISB.Hint = '') and (ISB.FileName = '') then Exit;  //因玉山影像放在Memory裡需使用 hint 來記檔名
+
+  XDpi:=ISB.Graphic.XDotsPerInch;
+  YDpi:=ISB.Graphic.YDotsPerInch;
+   IngronDis := Round(0.8 /2.54 * Xdpi);  //內容與十字最少要有的距離  先訂1公分
+  ISB.Refresh;
+  If FormHeight <> '' Then
+    FormH := Round(strtoFloat(FormHeight)/2.54*Xdpi)+UpPointL.Y
+  Else
+    FormH := 0;
+  //Therect:=Rect(Round(strtoFloat(L)/2.54*Xdpi)+UpPointL.X,Round(strtoFloat(T)/2.54*Xdpi)+UpPointL.Y,Round(strtoFloat(R)/2.54*Xdpi)+UpPointL.X,Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y);
+  //ckRect :=Rect(Round(strtoFloat(L)/2.54*Xdpi)+UpPointL.X-50,Round(strtoFloat(T)/2.54*Xdpi)+UpPointL.Y,Round(strtoFloat(R)/2.54*Xdpi)+UpPointL.X+50,Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y);
+  ckRect :=Rect(UpPointL.X,Round(strtoFloat(T)/2.54*Xdpi)+UpPointL.Y+5,UpPointR.X,Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y);
+  //showmessage(inttostr(ckrect.Left)+#13+inttostr(ckrect.Top)+#13+inttostr(ckrect.Right)+#13+inttostr(ckrect.Bottom)+#13+inttostr(Get_OMR(ckRect,ImageScrollBox1.Graphic)));
+
+  //IF (BlackPoint.X >0) and (BlackPoint.Y >0) and (SiteStr_Black <>'') and (FormH > 0) and ((Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y+IngronDis >= FormH) or (Get_OMR(ckRect,ImageScrollBox1.Graphic)<100))   {(Round(strtoFloat(T)/2.54*Xdpi) >= (9.3*Xdpi))} Then
+  //begin
+    //Therect:=Rect(BlackPoint.X-Round(strtoFloat(L1)/2.54*Xdpi),BlackPoint.Y -Round(strtoFloat(T1)/2.54*Xdpi),BlackPoint.X-Round(strtoFloat(R1)/2.54*Xdpi),BlackPoint.Y-Round(strtoFloat(B1)/2.54*Xdpi));
+    //Showmessage(inttostr(BlackPoint.X)+#13+inttostr(BlackPoint.Y)+#13+inttostr(Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y)+'-->'+inttostr(IngronDis)+'-->'+inttostr(FormH)+#13+inttostr(Get_OMR(ckRect,ImageScrollBox1.Graphic)));
+  {end
+  else
+  begin }
+    Therect:=Rect(Round(strtoFloat(L)/2.54*Xdpi)+UpPointL.X,Round(strtoFloat(T)/2.54*Xdpi)+UpPointL.Y,Round(strtoFloat(R)/2.54*Xdpi)+UpPointL.X,Round(strtoFloat(B)/2.54*Xdpi)+UpPointL.Y);
+  //end;
+  XZoom   :=  ( (ISB.Width-20)/(Therect.Right - Therect.Left + 0.3*XDpi) ) * 100;
+  YZoom   :=  ( (ISB.Height-20)/(Therect.Bottom - Therect.Top + 0.3*YDpi)) * 100;
+
+  { limit the zoom value to 1000 % }
+  newZoom := MinFloat(MinFloat(XZoom,100), YZoom) ;
+  ISB.ZoomPercent := newZoom ;
+  if ISB.ZoomPercent < 100 then
+   ISB.AntiAliased := True;
+
+  ISB.HorzScrollBar.Position := SafeTrunc(Therect.Left* newZoom /100 )-SafeTrunc(0.3*XDpi* newZoom /100);
+  ISB.VertScrollBar.Position := SafeTrunc((Therect.Top) * newZoom /100 )-SafeTrunc(0.2*YDpi* newZoom /100);
+  //加入區域底色
+  x1 := SafeTrunc(Therect.Left* newZoom /100 )-ISB.HorzScrollBar.Position;
+  x2 := SafeTrunc(Therect.Right* newZoom /100 )-ISB.HorzScrollBar.Position;
+  y1 := SafeTrunc(Therect.Top* newZoom /100 )-ISB.VertScrollBar.Position;
+  y2 := SafeTrunc(Therect.bottom* newZoom /100 )-ISB.VertScrollBar.Position;
+  //Application.ProcessMessages;   //當元件時不可亂用這個指令
+  ISB.Refresh;
+  sp.Brush.Color :=$00FEFAAD;
+  sp.Parent := ISB;
+  sp.Pen.Style := psSolid;
+  sp.Pen.Color := $00FEFAAD;
+  sp.Pen.Width := 1;
+  sp.Pen.Mode := pmMask;
+  sp.Left := x1;
+  sp.Top := y1;
+  sp.Width := x2-x1;
+  sp.Height := y2-y1;
+
+  {FAnnotationCanvas := TCanvas.Create;
+  FAnnotationCanvas.Handle := GetDC( ISB.Handle );
+  FAnnotationCanvas.Pen.Style := psSolid;
+  FAnnotationCanvas.Pen.Color := $00FEFAAD;  //&H80000005//65535;
+  FAnnotationCanvas.Pen.Width := 1;
+  FAnnotationCanvas.Pen.Mode := pmMask;}
+
+  { Draw box on screen }
+  {for i := y1 to y2 do begin
+    FAnnotationCanvas.MoveTo( x1, i );
+    FAnnotationCanvas.LineTo( x2, i );
+  end;
+  ReleaseDC(0,FAnnotationCanvas.Handle);
+  FAnnotationCanvas.Free; }
+
+end;
+
+Procedure Image_Smooth(Graphic:TDibGraphic);
+var
+    Transform : TSmoothTransform;
+    FUndoGraphic : TDibGraphic;
+begin
+  FUndoGraphic := TDibGraphic.Create;
+  FUndoGraphic.Assign(Graphic);
+  Transform := TSmoothTransform.Create;
+  try
+    Transform.ApplyOnDest(FUndoGraphic,Graphic);
+  finally
+    Transform.Free;
+    FUndoGraphic.Free;
+  end;
+end;
+
+///  FileName 傳入多筆換行字串
+procedure PrintImg(FileName, LoginID, Datetime,Path: WideString;WaterBmp:TBitmap);
+var
+  PrintMode      : TEnvisionPrintMode;
+  GraphicPrinter : TDibGraphicPrinter;
+  PrtDialog : TPrintDialog;
+  S : TStringlist;
+  i,Pages,Page : Integer;
+  Prt_String : String;
+  Prt_H : Integer;
+  ISB : TImageScrollBox;
+  procedure PrintWithManualPrintJob(LoginID,DateTime:String;Pages,Page:Integer);
+  begin
+      If Page = 1 Then
+      begin
+        { if UsePrintJob is False, Printer.BeginDoc and Printer.EndDoc must be
+          called by the user. This allows printing multiple images in the
+          same job (or page). }
+        GraphicPrinter.UsePrintJob := False;
+
+        { if UsePrintJob is False, the print job name that appears in the
+          print manager must be specified in using the Title property of the
+          Printer object. Otherwise, if UsePrintJob is True, the Title
+          property of the TDibGraphicPrinter object is used to specify the
+          job name. }
+        Printer.Title := '影像列印';
+      end;
+
+      IF (Page mod 2) = 1 Then
+        Printer.BeginDoc
+      Else
+        Printer.NewPage;
+
+      ISB.Graphic.Canvas.Font.PixelsPerInch := ISB.Graphic.XDotsPerInch;
+      ISB.Graphic.Canvas.Font.Size := 10;
+
+      ISB.Graphic.Canvas.TextOut(20,20, 'Print User:'+LoginID+' '+'Date:'+DateTime);
+
+      GraphicPrinter.Print(ISB.Graphic);
+
+
+      { this shows how to print text on a page.
+      Printer.Canvas.TextOut(10,10, 'Envision Image Library');
+      }
+      If ((Page mod 2) = 0) or (Page = pages) Then
+        Printer.EndDoc;
+  end;
+
+  procedure PrintWithAutoPrintJob;
+  begin
+      GraphicPrinter.UsePrintJob := True;
+      GraphicPrinter.Title       := '影像列印';
+      GraphicPrinter.Print(ISB.Graphic);
+  end;
+
+begin
+  ISB := TImageScrollBox.Create(nil);
+  S := TStringlist.Create;
+  GraphicPrinter := TDibGraphicPrinter.Create;
+  PrtDialog := TPrintDialog.Create(nil);
+  try
+    IF PrtDialog.Execute Then
+    begin
+      S.Text := FileName;
+      Pages := S.Count;
+
+      for i := 0 to S.Count -1 do
+      begin
+        ISB.LoadFromFile(Path+S.Strings[i],1);
+
+
+        if WaterBmp <> nil then
+          watermark2(WaterBmp,70,'',ISB.Graphic);
+        PrintWithManualPrintJob(LoginID,DateTime,Pages,i+1);
+      end;
+    end;
+
+  Finally
+  ISB.Free;
+  PrtDialog.Free;
+  GraphicPrinter.Free;
+  S.Free;
+  end;
+end;
+
+
+// Spec_Page :指定分批頁數,傳0則所有影像一次傳送
+procedure PrintImg(FileName, LoginID, Datetime,Path: WideString;WaterBmp:TBitmap;Spec_Page:Integer);
+var
+  PrintMode      : TEnvisionPrintMode;
+  GraphicPrinter : TDibGraphicPrinter;
+  PrtDialog : TPrintDialog;
+  S : TStringlist;
+  i,Pages,Page : Integer;
+  Prt_String : String;
+  Prt_H : Integer;
+  ISB : TImageScrollBox;
+  procedure PrintWithManualPrintJob(LoginID,DateTime:String;Pages,Page:Integer);
+  begin
+      If Page = 1 Then
+      begin
+        { if UsePrintJob is False, Printer.BeginDoc and Printer.EndDoc must be
+          called by the user. This allows printing multiple images in the
+          same job (or page). }
+        GraphicPrinter.UsePrintJob := False;
+
+        { if UsePrintJob is False, the print job name that appears in the
+          print manager must be specified in using the Title property of the
+          Printer object. Otherwise, if UsePrintJob is True, the Title
+          property of the TDibGraphicPrinter object is used to specify the
+          job name. }
+        Printer.Title := '影像列印';
+      end;
+
+      IF ((Spec_Page > 0) and ((Page mod Spec_Page) = 1)) or ((Spec_Page=0) and (page=1))  Then
+        Printer.BeginDoc
+      Else
+        Printer.NewPage;
+
+      ISB.Graphic.Canvas.Font.PixelsPerInch := ISB.Graphic.XDotsPerInch;
+      ISB.Graphic.Canvas.Font.Size := 10;
+
+      ISB.Graphic.Canvas.TextOut(20,20, 'Print User:'+LoginID+' '+'Date:'+DateTime);
+
+      GraphicPrinter.Print(ISB.Graphic);
+
+
+      { this shows how to print text on a page.
+      Printer.Canvas.TextOut(10,10, 'Envision Image Library');
+      }
+      If ((Spec_Page > 0) and ((Page mod Spec_Page) = 0)) or (Page = pages) Then
+        Printer.EndDoc;
+  end;
+
+  procedure PrintWithAutoPrintJob;
+  begin
+      GraphicPrinter.UsePrintJob := True;
+      GraphicPrinter.Title       := '影像列印';
+      GraphicPrinter.Print(ISB.Graphic);
+  end;
+
+begin
+  ISB := TImageScrollBox.Create(nil);
+  S := TStringlist.Create;
+  GraphicPrinter := TDibGraphicPrinter.Create;
+  PrtDialog := TPrintDialog.Create(nil);
+  try
+    IF PrtDialog.Execute Then
+    begin
+      S.Text := FileName;
+      Pages := S.Count;
+
+      for i := 0 to S.Count -1 do
+      begin
+        ISB.LoadFromFile(Path+S.Strings[i],1);
+
+
+        if WaterBmp <> nil then
+          watermark2(WaterBmp,70,'',ISB.Graphic);
+        PrintWithManualPrintJob(LoginID,DateTime,Pages,i+1);
+      end;
+    end;
+
+  Finally
+  ISB.Free;
+  PrtDialog.Free;
+  GraphicPrinter.Free;
+  S.Free;
+  end;
+end;
+
+procedure PrintImg(FileName, LoginID, Datetime,Path: WideString;WaterBmp:TBitmap;Spec_Page:Integer;NeedSetup:Boolean); overload;
+var
+  PrintMode      : TEnvisionPrintMode;
+  GraphicPrinter : TDibGraphicPrinter;
+  PrtDialog : TPrintDialog;
+  S : TStringlist;
+  i,Pages,Page : Integer;
+  Prt_String : String;
+  Prt_H : Integer;
+  ISB : TImageScrollBox;
+  procedure PrintWithManualPrintJob(LoginID,DateTime:String;Pages,Page:Integer);
+  begin
+      If Page = 1 Then
+      begin
+        { if UsePrintJob is False, Printer.BeginDoc and Printer.EndDoc must be
+          called by the user. This allows printing multiple images in the
+          same job (or page). }
+        GraphicPrinter.UsePrintJob := False;
+
+        { if UsePrintJob is False, the print job name that appears in the
+          print manager must be specified in using the Title property of the
+          Printer object. Otherwise, if UsePrintJob is True, the Title
+          property of the TDibGraphicPrinter object is used to specify the
+          job name. }
+        Printer.Title := '影像列印';
+      end;
+
+      IF ((Spec_Page > 0) and ((Page mod Spec_Page) = 1)) or ((Spec_Page=0) and (page=1))  Then
+        Printer.BeginDoc
+      Else
+        Printer.NewPage;
+
+      ISB.Graphic.Canvas.Font.PixelsPerInch := ISB.Graphic.XDotsPerInch;
+      ISB.Graphic.Canvas.Font.Size := 10;
+
+      ISB.Graphic.Canvas.TextOut(20,20, 'Print User:'+LoginID+' '+'Date:'+DateTime);
+
+      GraphicPrinter.Print(ISB.Graphic);
+
+
+      { this shows how to print text on a page.
+      Printer.Canvas.TextOut(10,10, 'Envision Image Library');
+      }
+      If ((Spec_Page > 0) and ((Page mod Spec_Page) = 0)) or (Page = pages) Then
+        Printer.EndDoc;
+  end;
+
+  procedure PrintWithAutoPrintJob;
+  begin
+      GraphicPrinter.UsePrintJob := True;
+      GraphicPrinter.Title       := '影像列印';
+      GraphicPrinter.Print(ISB.Graphic);
+  end;
+
+begin
+  ISB := TImageScrollBox.Create(nil);
+  S := TStringlist.Create;
+  GraphicPrinter := TDibGraphicPrinter.Create;
+  PrtDialog := TPrintDialog.Create(nil);
+  try
+    IF (not NeedSetup) or (NeedSetup and PrtDialog.Execute) Then
+    begin
+      S.Text := FileName;
+      Pages := S.Count;
+
+      for i := 0 to S.Count -1 do
+      begin
+        ISB.LoadFromFile(Path+S.Strings[i],1);
+
+
+        if WaterBmp <> nil then
+          watermark2(WaterBmp,70,'',ISB.Graphic);
+        PrintWithManualPrintJob(LoginID,DateTime,Pages,i+1);
+      end;
+    end;
+
+  Finally
+  ISB.Free;
+  PrtDialog.Free;
+  GraphicPrinter.Free;
+  S.Free;
+  end;
+end;
+
+Procedure Color2tif(Graphic:TObject;FileName:String); //彩色影像存Tif
+var
+  TiffGraphic :TTiffGraphic;
+begin
+  TiffGraphic := TTiffGraphic.Create;
+  try
+    if Graphic is TTiffGraphic then
+      TiffGraphic.Assign(TTiffGraphic(Graphic))
+    Else if Graphic is TDibGraphic then
+      TiffGraphic.Assign(TDibGraphic(Graphic))
+    else
+      Showmessage('Format Error');
+
+    if TiffGraphic.ImageFormat = ifBlackWhite then
+    begin
+      TiffGraphic.SaveToFile(FileName);
+    end
+    else
+    begin
+      TiffGraphic.Compression := tcJPEG;
+      TiffGraphic.JpegQuality := 30;
+      TiffGraphic.SaveToFile(FileName);
+    end
+
+  finally
+  TiffGraphic.Free;
+  end;
+end;
+
+
+end.

--
Gitblit v1.8.0