:Base64 識別與文本生成圖片的完整調(diào)用指南)
Umi-OCR HTTP 二維碼接口實戰(zhàn)Base64 識別與文本生成圖片的完整調(diào)用指南【免費下載鏈接】Umi-OCROCR software, free and offline. 開源、免費的離線OCR軟件。支持截屏/批量導(dǎo)入圖片PDF文檔識別排除水印/頁眉頁腳掃描/生成二維碼。內(nèi)置多國語言庫。項目地址: https://gitcode.com/GitHub_Trending/um/Umi-OCR本文基于 Umi-OCR 倉庫中 docs/http/api_qrcode.md 的官方接口說明系統(tǒng)講解 Umi-OCR 二維碼 HTTP 接口的兩類能力將 Base64 圖片解析為二維碼/條形碼文本以及從文本反向生成二維碼圖片。讀完后你可以直接在自己的項目前端腳本、后端服務(wù)或自動化流水線中集成離線二維碼識別與生成能力并從源碼層面理解接口背后的 zxingcpp 解析鏈、圖像預(yù)處理參數(shù)和錯誤碼設(shè)計。一、前置準備啟動 HTTP 服務(wù)Umi-OCR 的二維碼接口屬于其 HTTP 接口體系的一部分。調(diào)用接口前需要滿足以下條件開啟 HTTP 服務(wù)在 Umi-OCR 的全局設(shè)置頁中勾選“高級”選項后可以看到 HTTP 服務(wù)設(shè)置默認處于開啟狀態(tài)。接口手冊見 docs/http/README.md。確認監(jiān)聽端口默認端口為1224可從 UmiOCR-data/py_src/utils/pre_configs.py 中確認默認配置server_port: 1224。若端口被占用UmiOCR-data/py_src/server/web_server.py 中的服務(wù)邏輯會自動遞增端口并記錄實際端口以啟動日志中的Listening on http://...為準。訪問地址本機調(diào)用使用http://127.0.0.1:1224如需被局域網(wǎng)訪問需將主機切換為“任何可用地址”。從源碼結(jié)構(gòu)看HTTP 服務(wù)基于 Bottle 框架構(gòu)建并在 UmiOCR-data/py_src/server/web_server.py 中為所有響應(yīng)添加了Access-Control-Allow-Origin: *等跨域頭因此瀏覽器前端可以直接fetch調(diào)用同時單次請求體上限被設(shè)置為 100 MBBaseRequest.MEMFILE_MAX大尺寸圖片的 Base64 請求無需擔心被截斷。官方手冊還給出了三條運行注意事項見 docs/http/README.md關(guān)閉 Umi-OCR 時若仍有未斷開的 HTTP 連接可能導(dǎo)致進程關(guān)閉不完全需等待連接釋放或強制結(jié)束進程后端組件對并發(fā)支持較差盡量不要并發(fā)調(diào)用長時間、大批量、連續(xù)調(diào)用時小概率出現(xiàn)ECONNREFUSED之類報錯重新發(fā)起請求即可。二、接口總覽一個 URL兩種模式二維碼識別與二維碼生成共用同一個 URL/api/qrcode例http://127.0.0.1:1224/api/qrcode均為POST方法、JSON 字典參數(shù)。區(qū)分兩種模式的關(guān)鍵在于請求體中攜帶的鍵請求體含base64鍵 → 走圖片識別二維碼分支請求體含text鍵 → 走文本生成二維碼圖片分支。這一路由分派邏輯可以直接在 UmiOCR-data/py_src/server/qrcode_server.py 中確認# 路由函數(shù) def init(UmiWeb): UmiWeb.route(/api/qrcode, methodPOST) def _qrcode(): try: data request.json except Exception as e: return json.dumps({code: 800, data: f請求無法解析為json。}) if not data: return json.dumps({code: 801, data: f請求為空。}) if base64 in data: return json.dumps(base2text(data)) elif text in data: return json.dumps(text2base(data)) return json.dumps({code: 802, data: 指令中不存在 base64 或 text})由此得到一組“請求級”錯誤碼在任何分支之前就會返回code含義800請求體無法解析為 JSON801請求體為空802指令中既沒有base64也沒有text以下分兩節(jié)詳細講解兩種模式的請求/響應(yīng)格式與調(diào)用示例。三、模式一Base64 識別二維碼/api/qrcode傳入圖片的 Base64 編碼字符串返回圖中所有二維碼/條形碼的文本、格式、位置和方向。一張圖片中可能包含多個碼接口會逐一返回。3.1 請求格式方法POST參數(shù)為 JSON 字典base64必填。待識別圖像的 Base64 編碼字符串無需data:image/png;base64,等前綴。options可選。參數(shù)字典支持以下圖像預(yù)處理選項參數(shù)取值范圍默認行為說明preprocessing.median_filter_size1~9 的奇數(shù)不濾波中值濾波器大小用于去噪preprocessing.sharpness_factor0.1~10.0不調(diào)整銳度增強因子preprocessing.contrast_factor0.1~10.0不調(diào)整對比度增強因子1 增強0~1 減弱1 保持原樣preprocessing.grayscaletrue/falsefalse是否轉(zhuǎn)換為灰度圖preprocessing.threshold0~255 整數(shù)不生效二值化閾值僅當grayscaletrue時生效參數(shù)示例{ base64: iVBORw0KGgoAAAAN……, options: { preprocessing.sharpness_factor: 1.0, preprocessing.contrast_factor: 1.0, preprocessing.grayscale: false, preprocessing.threshold: false } }3.2 響應(yīng)格式返回 JSON頂層結(jié)構(gòu)與 OCR 結(jié)果非常相似字段類型描述codeint任務(wù)狀態(tài)碼。100為成功101為圖中無碼無文本其余為失敗datalist/string識別結(jié)果。成功時為列表101或失敗時為錯誤原因字符串timedouble識別耗時秒timestampdouble任務(wù)開始時間戳秒code100時data為列表記錄圖片中每個碼的結(jié)果每項包含參數(shù)名類型描述textstring碼的文本內(nèi)容formatstring碼的格式如QRCode可選值見下boxlist文本框順時針四個角的 xy 坐標[左上,右上,右下,左下]orientationint碼的方向0 為正上scoreint為與 OCR 格式兼容而設(shè)永遠為 1無實際含義支持的碼格式format取值A(chǔ)ztec、Codabar、Code128、Code39、Code93、DataBar、DataBarExpanded、DataMatrix、EAN13、EAN8、ITF、LinearCodes、MatrixCodes、MaxiCode、MicroQRCode、PDF417、QRCode、UPCA、UPCE識別成功的結(jié)果示例{ code: 100, data: [ { orientation: 0, box: [[4,4],[25,4],[25,25],[4,25]], score: 1, format: QRCode, text: abc } ], time: 0, timestamp: 1711521012.625574 }識別失敗含code101無碼、其他錯誤碼時data為字符串錯誤原因例如{code: 204, data: 【Error】zxingcpp 二維碼解析失敗。\n[Error] zxingcpp read_barcodes failed?!瓆3.3 調(diào)用示例JavaScript以下示例摘自官方文檔可直接用于瀏覽器或 Node 環(huán)境const url http://127.0.0.1:1224/api/qrcode; const base64 /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/...此處為完整 Base64原文見 docs/http/api_qrcode.md; const data { base64: base64 }; fetch(url, { method: POST, headers: {Content-Type: application/json}, body: JSON.stringify(data) }) .then(response response.json()) .then(data { if(data.code 100) { console.log(QRCode count:, data.data.length); for (let d of data.data) { console.log( text: , d.text); console.log( format: , d.format); console.log( orientation: , d.orientation); console.log( ); } } else { console.log(Error! Code, data.code, Msg: , data.data); } }) .catch(error console.error(error));3.4 源碼解析識別鏈路與錯誤碼識別二維碼的實際執(zhí)行邏輯位于 UmiOCR-data/py_src/mission/mission_qrcode.py。HTTP 層base2text取出base64與options后通過MissionQRCode.addMissionWait(opt, [{base64: base64}])提交任務(wù)并同步等待結(jié)果核心處理在msnTask方法中鏈路為讀圖 → 預(yù)處理 → zxingcpp 解析 → 結(jié)果轉(zhuǎn)字典各環(huán)節(jié)都有獨立錯誤碼code階段說明901依賴檢查無法導(dǎo)入二維碼解析器 zxingcpp202讀圖圖片讀取失敗Base64 解碼或Image.open失敗203預(yù)處理圖像預(yù)處理失敗204解析zxingcpp.read_barcodes拋異常205結(jié)果轉(zhuǎn)換解析結(jié)果轉(zhuǎn)字典失敗101無碼圖中未找到任何碼data為QR code not found in the image.102解碼失敗檢測到碼但全部解碼無效幾個值得注意的實現(xiàn)細節(jié)均見 UmiOCR-data/py_src/mission/mission_qrcode.pybox 坐標順序_zxingcpp2dict按top_left → top_right → bottom_right → bottom_left組裝四個角與文檔“順時針四角”的描述一致。非文本內(nèi)容的處理當碼的content_type不是Text時如 GS1、二進制內(nèi)容源碼會先嘗試按 UTF-8 解碼bytes解碼失敗則在文本前加[Base64]標記并以 Base64 字符串輸出。也就是說text字段在極少數(shù)情況下可能是“type: Binary Base64”的混合內(nèi)容調(diào)用方需留意。預(yù)處理參數(shù)與文檔的對應(yīng)關(guān)系_preprocessing方法mission_qrcode.py中中值濾波使用 PIL 的MedianFilter(sizes)且要求奇數(shù)銳度、對比度使用ImageEnhance二值化邏輯為灰度值 threshold → 255否則 → 0且僅在grayscaletrue時執(zhí)行——這解釋了為什么文檔強調(diào)threshold只在灰度模式下生效。score 恒為 1源碼中d[score] 1有注釋“置信度兼容OCR格式無意義”與文檔描述吻合。四、模式二從文本生成二維碼圖片/api/qrcode傳入文本根據(jù)文本生成二維碼圖片返回圖片的 Base64 字符串JPEG 編碼。URL 與識別接口一致僅請求參數(shù)不同。4.1 請求格式方法POST參數(shù)為 JSON 字典text必填。要寫入二維碼的文本。options可選。參數(shù)字典參數(shù)類型默認值說明formatstringQRCode碼格式可選值同識別接口的 format 列表wint0生成圖像寬度0表示自動設(shè)為最小寬度hint0生成圖像高度0表示自動設(shè)為最小高度quiet_zoneint-1碼四周空白邊緣寬度-1表示自動調(diào)節(jié)ec_levelint-1糾錯等級。-1:自動1:7%0:15%3:25%2:30%。僅對Aztec、PDF417、QRCode生效參數(shù)示例{ text: 要寫入二維碼的文本, options: { format: QRCode, w: 0, h: 0, quiet_zone: -1, ec_level: -1 } }4.2 響應(yīng)格式字段類型描述codeint100成功其余為失敗datastring成功時為圖片的 Base64 字符串JPEG 編碼失敗時為錯誤信息字符串4.3 調(diào)用示例JavaScriptconst url http://127.0.0.1:1224/api/qrcode; const data { text: test abc 123 !!!, // options: { // format: QRCode, // w: 0, // h: 0, // quiet_zone: -1, // ec_level: -1, // } }; fetch(url, { method: POST, headers: {Content-Type: application/json}, body: JSON.stringify(data) }) .then(response response.json()) .then(data { if(data.code 100) { console.log(Image base64: \n, data.data); } else { console.log(Error! Code, data.code, Msg: , data.data); } }) .catch(error console.error(error));拿到 Base64 后前端可直接拼成img srcdata:image/jpeg;base64,...展示后端則可解碼寫盤。4.4 源碼解析生成鏈路生成分支的服務(wù)端實現(xiàn)為 UmiOCR-data/py_src/server/qrcode_server.py 中的text2base它從options中取出format默認QRCode、w/h默認0、quiet_zone默認-1、ec_level默認-1調(diào)用MissionQRCode.createImage得到 PIL 圖像再以JPEG格式寫入BytesIO并 Base64 編碼返回——這與文檔“返回圖片編碼為 jpeg”的描述一致異常時返回{code: 200, data: [Error] ...}。真正的編碼動作在 UmiOCR-data/py_src/mission/mission_qrcode.py 的createImage中先通過getattr(zxingcpp.BarcodeFormat, format, None)校驗格式名是否合法非法格式直接返回[Error] format {format} not in zxingcpp.BarcodeFormat!調(diào)用zxingcpp.write_barcode(bFormat, text, w, h, quiet_zone, ec_level)生成位圖再經(jīng)Image.fromarray(bit, L)轉(zhuǎn)為灰度 PIL 圖像源碼注釋明確了糾錯等級映射-1自動、1對應(yīng) L(7%)、0對應(yīng) M(15%)、3對應(yīng) Q(25%)、2對應(yīng) H(30%)且糾錯等級僅用于Aztec、PDF417和QRCode——與文檔表格一致。五、錯誤碼速查與常見問題把請求級與分支級錯誤碼匯總?cè)缦路奖闩耪蟘ode所屬分支含義800路由層請求無法解析為 JSON801路由層請求為空802路由層指令中不存在base64或text901識別zxingcpp 解析器導(dǎo)入失敗100識別/生成成功101識別圖中無碼102識別碼全部解碼失敗200生成生成過程拋異常data為錯誤信息202識別圖片讀取失敗203識別圖像預(yù)處理失敗204識別zxingcpp 解析異常205識別結(jié)果轉(zhuǎn)字典失敗實踐建議先驗連通性瀏覽器訪問http://127.0.0.1:1224/應(yīng)返回 Umi-OCR 的名稱標識見 web_server.py 的根路由可用于確認服務(wù)已啟動。小圖失敗時加預(yù)處理對模糊、有噪點的截圖可組合median_filter_size奇數(shù)contrast_factor1 灰度/二值化重試參數(shù)含義見 3.1 節(jié)表格。避免并發(fā)官方手冊明確后端并發(fā)支持較差批量業(yè)務(wù)請串行調(diào)用偶發(fā)ECONNREFUSED時重試即可。注意score字段該字段僅用于格式兼容不要將其當作置信度使用。六、相關(guān)文檔與延伸閱讀二維碼接口并非孤立存在Umi-OCR 的 HTTP 接口手冊中還包含可組合使用的其他能力HTTP接口手冊總覽服務(wù)開啟、局域網(wǎng)訪問與注意事項圖片OCR接口Base64 圖片文字識別其響應(yīng)格式box/score/end與二維碼接口刻意保持兼容文檔識別PDF流程上傳 → 輪詢 → 下載 → 清理的完整任務(wù)流配套 Python 示例 與 Web 示例命令行接口/argv接口等價于命令行傳參僅允許127.0.0.1調(diào)用可參考 README_CLI.md 了解全部命令行參數(shù)CHANGE_LOG.md 記錄了二維碼功能演進二維碼解析庫改用 zxingcpp、新增二維碼識別頁與生成功能、HTTP 二維碼接口支持圖像預(yù)處理參數(shù)等可作為版本能力確認依據(jù)?!久赓M下載鏈接】Umi-OCROCR software, free and offline. 開源、免費的離線OCR軟件。支持截屏/批量導(dǎo)入圖片PDF文檔識別排除水印/頁眉頁腳掃描/生成二維碼。內(nèi)置多國語言庫。項目地址: https://gitcode.com/GitHub_Trending/um/Umi-OCR創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考