reassemble/img/transformer.pas
@@ -1,16 +1,20 @@
{ ==============================================================================
  方法名稱:ImageReSize_FormID
  引用相依:CheckSize, FileExists, FindPoint, ImageReSize_FormID, ImageResize, L
            oadFileGetMD5, LoadFromFile, SaveToFile
  方法描述:根據表單的十字定位點或邊框 (ANCHOR/FRAME) 對掃瞄影像進行縮放調整。流
            程如下:
            1. 從 FORM_INF_List 取得表單預設高寬與定位類型。
            2. 載入對應案件下的影像檔,若為補件模式則跳過原有圖檔。
            3. 呼叫 FindPoint 尋找影像中的十字線或邊框。
            4. 呼叫 CheckSize 計算偏移與縮放比例。
            5. 呼叫 ImageResize 執行實際調整。
            6. 成功縮放後,記錄檔案 MD5 並儲存更新後的影像,同時將操作記錄寫入 ReS
            ize.dat;若定位點遺失或辨識錯誤,則記錄於 AnchorError.dat。
  引用相依:CheckSize, FileExists, FindPoint, FileName2FormCode, FindSQLData,
            GetFindResult, ImageReSize_FormID, ImageResize, ISExistImg,
            LoadFileGetMD5, LoadFromFile, SaveToFile
  方法描述:【正式案件影像定位縮放】
            依據表單定義的定位點(十字線或邊框)對案件影像進行標準化縮放。
            1. 識別與檢核:從檔案名稱提取 FormID,並從資料庫 (FORM_INF_List) 讀取標準
               寬高與定位點類型 (ANCHOR/FRAME)。
            2. 補件保護:若 FWH_category 為 'N'(補件模式)且影像已存在,則跳過處理。
            3. 定位偵測:載入影像後,利用 FindPoint 尋找左上、右上、左下三個定位點。
            4. 縮放執行:調用 CheckSize 計算尺寸偏移量,並執行 ImageResize 進行實體
               縮放與對齊。
            5. 資料完整性:縮放後重新驗證定位點,若成功則覆蓋原檔並更新 MD5 排除清單,
               同時於 ReSize.dat 紀錄處理時間與尺寸資訊。
            6. 錯誤處理:若定位點找尋失敗(如污損、傾斜過大),則將錯誤原因紀錄於
               AnchorError.dat 以供後續人工排錯。
============================================================================== }
Procedure TCB_IMGPSScanX.ImageReSize_FormID(CaseID,FileName:String);  //依十字定位點做縮放
var
@@ -33,11 +37,9 @@
    DW := GetFindResult('T1.FORM_WIDTH');
    ANCHOR := UpperCase(GetFindResult('T1.ANCHOR'));
    ANCHOR := Index2Anchor(ANCHOR);
Display1.Lines.Add(FormID+','+DH+','+DW);
//ShowMessage('AAAAAAAAA');
    Display1.Lines.Add(FormID+','+DH+','+DW);
    if ((ANCHOR = 'ANCHOR') or (ANCHOR = 'FRAME')) and (DH <> '') and (DW <> '') then  //有十字定位點
    begin
//ShowMessage('BBBBBBB');
      ImageScrollBox1.LoadFromFile(ImageSavePath+CaseID+'\Upload\'+FileName,1);
      if (FWH_category='N') and  ISExistImg(ImageSavePath+CaseID+'\Upload\'+FileName) then
@@ -45,7 +47,6 @@
        Exit;//20171103  補件  原有的圖不作resize
      end;
      //FindPoint(ImageScrollBox1.Graphic,UpLPoint,UpRPoint,DownLPoint,NowW,NowH);
      FindPoint(ISB_BW.Graphic,UpLPoint,UpRPoint,DownLPoint,NowW,NowH,ANCHOR);
      SizeStr := CheckSize(ISB_BW,UpLPoint,UpRPoint,DownLPoint,DW,DH);
@@ -56,7 +57,6 @@
      v1 := length(SizeStr);
      IF (SizeStr <> '') and (Copy(SizeStr,1,v) <> 'ERROR') then
      begin
//ShowMessage('CCCCC');
        if (ISExistImg(ImageSavePath+CaseID+'\Upload\'+FileName)) and (reSizeExistImgList.IndexOf(LoadFileGetMD5(ImageSavePath+CaseID+'\Upload\'+FileName))=-1) then
        begin
          IsRecordMD5:=True;
@@ -66,11 +66,10 @@
        begin
          reSizeExistImgList.add(LoadFileGetMD5(ImageSavePath+CaseID+'\Upload\'+FileName));
        end;
//showmessage(ImageSavePath+CaseID+'\Upload\'+FileName);
        S := TStringlist.Create;                     ///20110422拿掉 換成上傳才做
        if FileExists(ImageSavePath+CaseID+'\Upload\ReSize.dat') then
          S.LoadFromFile(ImageSavePath+CaseID+'\Upload\ReSize.dat');
        //S.Add(FormCode2FormName(FormID)+' '+SizeStr);
        S.Add(FileName+','+SizeStr+#8+DateTimetoStr(Now));
        S.SaveToFile(ImageSavePath+CaseID+'\Upload\ReSize.dat');
        S.Free;
@@ -93,12 +92,16 @@
{ ==============================================================================
  方法名稱:ImageReSize_tmp
  引用相依:CheckSize, ImageReSize_tmp, ImageResize, LoadFromFile, SaveToFile
  方法描述:針對暫存影像檔案執行十字定位點縮放處理。此方法是 ImageReSize_FormID
            的簡化版本,主要針對暫存檔 (FileName) 與指定的 FormID。邏輯包含從資料
            庫清單查詢表單尺寸與定位模式,若符合 ANCHOR 或 FRAME 類型,則載入影像
            並呼叫 CheckSize 檢查是否需要調整。若偵測到影像存在偏移或比例差異(Siz
            eStr 非空),則將調整後的影像直接覆蓋儲存回原始路徑。
  引用相依:CheckSize, FindSQLData, GetFindResult, Index2Anchor, ImageReSize_tmp,
            ImageResize, LoadFromFile, SaveToFile
  方法描述:【暫存影像定位縮放】
            針對掃描過程中的臨時或暫存影像檔案執行快速定位點縮放。
            1. 規格查詢:依傳入的 FormID 查詢表單規格。
            2. 自動校正:載入影像後,透過 CheckSize 自動偵測三個定位點座標。
            3. 原地覆蓋:若 CheckSize 回傳非空值(代表檢測通過且已計算偏移),則直接
               將校正後的影像儲存回原始路徑。
            此方法邏輯較 ImageReSize_FormID 簡潔,不紀錄 MD5 與詳細日誌,主要用於
            處理即時上傳或切割前的預處理影像。
============================================================================== }
Procedure TCB_IMGPSScanX.ImageReSize_tmp(FormID,FileName:String);  //依十字定位點做縮放(暫存檔)
var
@@ -129,12 +132,15 @@
{ ==============================================================================
  方法名稱:CheckNeedCrop
  引用相依:CheckNeedCrop, TDibGraphic
  方法描述:判斷掃瞄影像是否為 A3 尺寸並需要進行切割(Crop)。判定邏輯有二:首先,檢
            查影像寬度是否大於 4 倍的 DPI 閥值,藉此初步判斷為大尺寸掃瞄件;其次,
            遍歷目前的條碼清單 (MpsBarcodeinf),統計有效的表單代碼 (FormID) 數量。
            如果影像寬度達標且有效表單數量正好為 2,則返回 True。這代表此張大圖實
            際上是由兩份 A4 表單併排掃瞄而成,後續需依此旗標進行影像分割處理。
  引用相依:CheckNeedCrop, FormIDExists, MpsBarcodeinf, TDibGraphic
  方法描述:【A3 影像切割判定】
            判定目前的影像是否為「一紙兩面」的 A3 規格,進而決定是否執行切割 (Crop)。
            判定邏輯包含兩大要件:
            1. 物理尺寸:影像寬度必須大於 DPI 的 4 倍(針對 A3 橫向掃描的特徵)。
            2. 內容特徵:檢查當前偵測到的條碼清單 (MpsBarcodeinf),統計其中符合系統
               定義長度 (FormIDLength) 且在資料庫中有效的 FormID 數量。
            判定結果:當上述物理條件成立,且「有效表單代碼數量精確等於 2」時,回傳
            True,觸發後續的影像切割流程。
============================================================================== }
Function TCB_IMGPSScanX.CheckNeedCrop(Graphic:TDibGraphic):Boolean; //是否是A3要切影像
Var
@@ -143,7 +149,6 @@
  Result := False;
  FormIDCount := 0;
  if (Graphic.Width > (4 * Graphic.XDotsPerInch)) {or (Graphic.Height > (15 * Graphic.YDotsPerInch))} then
  //if (Graphic.Width > (6 * Graphic.XDotsPerInch)) then
  begin
    for I := 1 to MpsBarcodeinf.Count do
    begin
@@ -152,10 +157,7 @@
        inc(FormIDCount);
      end;
    end;
  end;
//ShowMessage('FormIDCount='+IntToStr(FormIDCount)+#10#13+'MpsBarcodeinf.count='+IntToStr(MpsBarcodeinf.count));
  if FormIDCount = 2 then
  begin
    Result := True;