| 比對新檔案 |
| | |
| | | // 公司 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. |