curtis
19小時前 62c5adb8641e8626a056abc773b72449152d8ae9
doc/curtis/Image_Processer_Analysis.md
@@ -1,8 +1,8 @@
# 影像處理與轉換模組 (Image Processor) 深度分析
在 `CB_IMGPSScanImp.pas.bk` 中,「影像處理與轉換模組」負責在硬體掃描取得原始影像後,以及上傳/顯示之前,對影像進行一系列的強化、分析與格式轉換。這個模組是決定影像品質、檔案大小與後續 OMR 辨識準確率的關鍵。
在 `CB_IMGPSScanImp.pas.bk` 與 `iis_image_process.pas` 中,「影像處理與轉換模組」負責在硬體掃描取得原始影像後,以及上傳/顯示之前,對影像進行一系列的強化、分析與格式轉換。這個模組是決定影像品質、檔案大小與後續 OMR 辨識準確率的關鍵。
若要將此模組進一步細拆,其內部組成可分為以下四大子分類:
根據源碼分析,其內部組成可細拆為以下六大子分類:
---
@@ -10,113 +10,118 @@
**職責**:專責處理影像的空間座標轉換、旋轉、去斜以及裁切,確保最終儲存的影像端正且符合業務規定的尺寸。
**核心實作特性**:
*   **影像去斜與轉正**:
    *   `DeskewImg`:透過演算法自動偵測影像傾斜角度並將其校正。
    *   `Rotate`:依據條碼辨識出的角度 (`MpsBarcodeinf.r180`) 或使用者手動點擊按鈕 (`SpeedButton14Click` 等),進行 90、180、270 度的旋轉。
*   **影像去斜與轉正 (Deskew & Rotate)**:
    *   `DeskewImg`:透過演算法自動偵測影像傾斜角度並將其校正。支援先以黑白影像偵測角度再套用於彩色影像的優化路徑。
    *   `Rotate`:執行 90、180、270 度的旋轉,可用於條碼方向校正或使用者手動轉向。
*   **幾何校正規範 (Geometric Validation)**:
    *   `GetPosAngle`:計算三個定位點之間的夾角,用以判定影像是否嚴重形變。
    *   `CheckSize`:比對定位點距離與標準長寬,若有巨大落差則記錄並自動執行補償性縮放。
*   **影像裁切與分割**:
    *   `CheckNeedCrop`:根據影像寬高比與偵測到的條碼數量,判斷是否為需要分割的 A3 雙頁合併影像。
    *   `CropImg`:給定 `TRect` 座標,將 A3 影像精準裁切為兩張 A4 (`iGraphic_First`, `iGraphic_sec`)。
    *   `CheckNeedCrop` 與 `CropImg`:針對 A3 雙頁合併影像進行自動分割或特定區域裁切。
*   **影像縮放 (Resize)**:
    *   `ImageReSize_FormID` / `ImageReSize_tmp`:依據表單定義檔 (`FORM_INF`) 中的長寬設定與尋找到的十字定位點,強制將影像縮放變形至標準尺寸,以利後續的 OMR 座標對位。
    *   `DpiResize`:調整影像的 DPI 解析度參數。
    *   `ImageReSize_FormID` / `ImageResize`:依據表單定義或目標解析度強制縮放影像,確保 OMR 座標對位精準。
## 2. 色彩處理與編碼轉換器 (Color & Format Converter)
**職責**:處理影像的色彩深度 (位元深度) 轉換,以及針對不同色彩模式套用最適合的檔案壓縮演算法,以達到最佳的畫質與檔案大小平衡。
**職責**:處理影像色彩深度轉換,套用最適合的壓縮演算法,並進行濾鏡強化以提升辨識率。
**核心實作特性**:
*   **色彩空間轉換**:
    *   `ConvertToBW`:將彩色或灰階影像強制二值化 (Binarization) 轉為黑白影像,這不僅能大幅縮小檔案,也是條碼與 OMR 辨識的必要前置步驟 (系統通常會保留一個隱藏的 `ISB_BW` 物件專做辨識用)。
    *   `ConvertToGray`:將彩色轉換為灰階 (`ifGray256`)。
    *   `Image_Smooth` / `NegativeImg` / `CleanupBorder`:影像平滑化、反相處理與清除黑邊。
*   **格式與壓縮決策**:
    *   針對黑白影像 (`ifBlackWhite`):使用 `tcGroup4` (CCITT Group 4 Fax Compression) 或 `tcPackBits` 壓縮,並儲存為 `.tif`。
    *   針對彩色/灰階影像 (`ifTrueColor`, `ifGray256`, `ifColor256`):轉換為 `TJpegGraphic`,套用 `tcJpeg` 壓縮與指定的壓縮率 (`FJpgCompression` / `SaveQuality`),並儲存為 `.jpg`。
*   **先進二值化 (Advanced Binarization)**:
    *   `ConvertToBW`:標準二值化處理。
    *   `Gray2BW_RTS` / `Color2BW_RTS`:整合 VRS (Virtual ReScan) 技術,透過特定參數精細化灰階轉黑白的過程,保留關鍵特徵。
*   **影像增強濾鏡**:
    *   `Image_Smooth`(平滑)、`Emboss`(浮雕)、`BrightnessImg`(亮度調整)。
    *   `FilterColor`:濾掉特定顏色(如紅字或背景色)僅保留黑白內容。
    *   `CleanupBorder`:自動清除影像邊緣的掃描黑邊。
## 3. 條碼識別與解析器 (Barcode Recognizer)
**職責**:獨立負責掃描與解析影像上的一維或二維條碼,這是系統實現「文件自動歸類」的核心依賴。
**職責**:獨立負責解析影像上的一維或二維條碼,實現「文件自動歸類」。
**核心實作特性**:
*   **條碼引擎呼叫**:
    *   `MpsGetBarcode`:呼叫底層的 MPS Barcode 引擎,傳入二值化的影像 (`ISB_BW.Graphic`)。
    *   回傳 `TMpsBarcodeinf` 結構,包含條碼內容字串陣列 (`Text`) 與每個條碼的方向資訊 (`r180`)。
*   **應用與邏輯綁定**:
    *   透過條碼字串找出對應的 `FormID` 與 `DocNo`。
    *   檢查條碼長度是否符合規範 (`FormIDLength`),過濾雜訊或誤判的條碼。
*   **條碼引擎調用**:
    *   `MpsGetBarcode`:呼叫底層引擎解析二值化影像。
    *   `PrintBarcode`:反向操作,將文字轉換為 Code39 條碼並繪製於影像上。
*   **邏輯綁定**:根據條碼字串自動關聯 `FormID` 與 `DocNo`。
## 4. OMR 與十字定位點分析器 (OMR & Anchor Analyzer)
## 4. OMR 與定位分析引擎 (OMR & Anchor Analyzer)
**職責**:專門為「光學標記辨識 (OMR)」服務,負責找出影像上的基準定位點,並計算特定區域內的黑白像素分佈。
**職責**:為光學標記辨識服務,尋找基準點並計算像素分佈。
**核心實作特性**:
*   **基準點尋找 (Anchor Finding)**:
    *   `FindPoint`:根據 XML 定義的模式 (`ANCHOR` 或 `FRAME`),在影像四個角落尋找定位基準點 (`UpLPoint`, `UpRPoint`, `DownLPoint`, `DownRPoint`)。
    *   `CheckSize`:比對找到的定位點距離與標準長寬是否有巨大落差,若找不到則記錄至 `AnchorError.dat`。
*   **像素計算與標記判定 (Pixel Calculation)**:
    *   `GetSiteOMR`:根據 XML 傳入的相對座標字串 (`Site`),將其換算為實際的 `TRect`。
    *   `Get_OMR`:計算該區域內黑色像素的數量。
    *   結合雜訊過濾 (`ClearLine`) 與容差值 (`SafePixel`, `bt`),最終判定該 OMR 欄位是否「有畫記」。
*   **基準點偵測 (Anchor & Spot Detection)**:
    *   `FindPoint`:支援 `ANCHOR` (十字) 或 `FRAME` (框線) 定位模式。
    *   `FindBlackPoint` / `GetBlackSpots`:在指定邊界內搜尋特定比例的黑塊作為定位參考。
*   **像素判定**:
    *   `Get_OMR`:計算區域內黑色像素數量。
    *   `GetPixBW`:底層像素層級的黑白狀態讀取。
## 5. 影像合成與標記引擎 (Image Synthesis & Annotation) —— [NEW]
**職責**:在影像上疊加業務資訊,或自動生成業務用的單據影像。
**核心實作特性**:
*   **動態浮水印 (Watermark)**:
    *   `Watermark1_Hong`:支援透明度、自定義文字與旋轉(如斜向 330 度)的水印疊加。
*   **業務戳記與單據生成**:
    *   `CreateStamp`:產生包含 UserID 與日期的電子圓戳記。
    *   `CreateNote` / `CreateDraft`:產生空白的便條或草稿圖層。
    *   `CreateReportImg_JSON`:根據 JSON 資料自動合成補件清單影像,整合背景、條碼與文字內容。
## 6. UI 互動輔助與元數據管理 (UI & Metadata) —— [NEW]
**職責**:處理視窗介面上的標記、框選,以及影像檔案內部的隱藏資訊。
**核心實作特性**:
*   **互動標記**:
    *   `ShowKeyinRect` / `SetKeyinRect_New`:在畫面上動態顯示黃色或透明遮罩,引導人員登打特定欄位。
    *   `GetSelectRect2String`:將人員在 UI 上拖曳的框選區域轉換為公分單位。
*   **元數據處理**:
    *   `GetTag` / `SetTag`:利用 Tiff 檔案的 `ImageDescriptionTag` 儲存自定義業務資訊。
    *   `JpgReSize_Exif`:在處理 JPG 影像時保留或讀取拍攝日期等 EXIF 資訊。
---
## 影像相關關鍵字:
```js
[
'TTiffGraphic',
'TDibGraphic',
'DeskewImg',
'Rotate',
'CropImg',
'ImageReSize_FormID',
'ImageReSize_tmp',
'CheckNeedCrop',
'ImageProcessor.transformer',
'ConvertToBW',
'ConvertToGray',
'Image_Smooth',
'NegativeImg',
'CleanupBorder',
'ImageProcessor.converter',
'MpsGetBarcode',
'Get_OMR',
'ImageProcessor.barcodeRecognizer',
'FindPoint',
'BrightnessImg',
'CheckSize',
'GetSiteOMR',
'ImageProcessor.anchorAnalyzer',
'TJpegGraphic',
'DpiResize',
// 以下可省
'SaveQuality',
'FJpgCompression',
'ifTrueColor',
'ifGray256',
'CleanupBorder',
'Color2BW_RTS',
'ConvertToBW',
'ConvertToGray',
'CreateReportImg_JSON',
'CreateStamp',
'CropImg',
'DeskewImg',
'DpiResize',
'FilterColor',
'FindBlackPoint',
'FindPoint',
'GetBlackSpots',
'GetSelectRect2String',
'GetTag',
'Get_OMR',
'Gray2BW_RTS',
'ImageResize',
'Image_Smooth',
'NegativeImg',
'CleanupBorder',
'ifBlackWhite',
'tcGroup4',
'tcPackBits',
'tcJpeg',
'ifColor25'
'JpgReSize_Exif',
'MpsGetBarcode',
'PrintBarcode',
'Rotate',
'SetTag',
'ShowKeyinRect',
'TDibGraphic',
'TJpegGraphic',
'TNBCleanupBorderTransform',
'TTiffGraphic',
'TWatermarkTransform',
'Watermark1_Hong',
]
```
## 💡 未來重構與微服務化建議
若要對此影像處理模組進行重構,建議方向如下:
1.  **抽離為獨立的 Pipeline 模式 (管線模式)**:
    目前這些功能散落在 `OnAcquire` 與各個事件中。應將其重構為一條清晰的影像處理管線:`Image -> Deskew -> Crop -> ConvertBW -> BarcodeRead -> Resize -> Compress -> Save`。每個步驟 (Step) 應該是獨立的類別,方便抽換或開關。
2.  **解耦 UI 與影像處理**:
    目前大量依賴畫面上隱藏的 `ISB_BW` (TImageScrollBox) 來進行二值化和條碼辨識。這違反了 MVC 原則且耗費額外的 GDI 資源。應改用純記憶體物件 (如獨立的 `TDibGraphic` 或 `TBitmap`) 在背景執行緒中進行這些運算,不要綁定可見的 UI 元件。
3.  **引入更現代的影像引擎 (如 OpenCV)**:
    早期依賴的 Envision SDK 在尋找十字定位點 (FindPoint) 和去斜 (DeskewImg) 的演算法可能較為老舊。若未來轉型為微服務架構,可將這部分邏輯移植為 Python/C++ 並使用 OpenCV 來達成更精準的高速運算。
1.  **抽離為獨立的 Pipeline 模式**:
    應將影像處理流程標準化:`Image -> PreProcess -> Recognize -> Synthesize -> Output`。
2.  **Web 化對策**:
    *   **Canvas 合成**:影像合成(水印、戳記)功能可轉移至瀏覽器端的 Canvas API 實作。
    *   **影像處理庫**:OpenCV.js 可用於處理去斜與 OMR 偵測;EXIF.js 用於處理照片元數據。
3.  **解耦 UI 與影像處理**:
    避免依賴 `TImageScrollBox` 等 UI 元件進行二值化運算。改用純記憶體物件處理,以利於在 Web Worker 中平行運算。