# aardio 范例: 图文识别 - GLM-OCR

```aardio
//图文识别 - GLM-OCR
//相关范例 - DeepSeek OCR2: https://www.aardio.com/zh-cn/doc/example/AI/image/deepseek-ocr.html

import win.ui;
import win.dlg.message;
import fonts.fontAwesome;
/*DSG{{*/
var winform = win.form(text="GLM-OCR 图文识别工具";right=1169;bottom=573)
winform.add(
bkplus={cls="bkplus";left=-17;top=516;right=1170;bottom=575;bgcolor=0xF5F5F5;db=1;dl=1;dr=1;z=1};
btnOcr={cls="plus";text="识别文本";left=967;top=530;right=1070;bottom=560;align="left";color=0x3C3C3C;db=1;dr=1;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome');padding={left=8}};iconText='\uF0F6';notify=1;textPadding={left=25};z=6};
btnOpen={cls="plus";text="打开图像文件";left=293;top=532;right=426;bottom=562;align="left";color=0x3C3C3C;db=1;dl=1;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome');padding={left=8}};iconText='\uF03E';notify=1;textPadding={left=25};z=4};
btnPaste={cls="plus";text="粘粘自剪贴板";left=160;top=532;right=279;bottom=562;align="left";color=0x3C3C3C;db=1;dl=1;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome');padding={left=8}};iconText='\uF0EA';notify=1;textPadding={left=25};z=5};
btnScreenClip={cls="plus";text="截屏";left=76;top=532;right=146;bottom=562;align="left";color=0x3C3C3C;db=1;dl=1;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome');padding={left=8}};iconText='\uF030';notify=1;textPadding={left=25};z=8};
edit={cls="richedit";left=589;top=0;right=1168;bottom=515;autohscroll=false;aw=1;db=1;dr=1;dt=1;edge=1;link=1;multiline=1;vscroll=1;z=3};
editApiKey={cls="edit";left=669;top=529;right=947;bottom=557;edge=1;multiline=1;password=1;z=10};
lnkTranslate={cls="plus";text="AI 翻译";left=1085;top=530;right=1172;bottom=560;align="left";color=0x3498DB;db=1;disabled=1;dr=1;font=LOGFONT(h=-14);iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome')};iconText='\uF0DB';notify=1;textPadding={left=18};z=9};
picturebox={cls="plus";text="请复制图像到剪贴板 / 或拖放文件到此处";left=0;top=0;right=584;bottom=515;aw=1;bgcolor=0xFFFFFF;color=0x999999;db=1;dl=1;dt=1;edge=1;font=LOGFONT(h=-16);iconStyle={font=LOGFONT(h=-60;name='FontAwesome')};iconText='\uF03E';repeat="scale";textPadding={top=100};z=2};
splitter={cls="splitter";left=583;top=0;right=588;bottom=515;bgcolor=0xFFFFFF;db=1;dt=1;frame=1;z=7}
)
/*}}*/

var ocr = function(winform,imageBuffer){
	import inet.urlData;
	import web.rest.jsonClient;
	
	var http = web.rest.jsonClient();
	http.setAuthToken(winform.editApiKey.text);
	var api = http.api("https://open.bigmodel.cn/api");
 
	var ret, err = api.paas.v4.layout_parsing({
		file=inet.urlData.fromImage(imageBuffer);
		model="glm-ocr"	
	});
	
	if(ret){
    	winform.edit.text = ret.md_results;
    	winform.lnkTranslate.disabled = false;
	}
	else {
    	 winform.edit.text = err || "出错了";
	}  
	
    winform.btnOcr.disabledText = null;  
}

winform.btnOcr.oncommand = function(id,event){
	if(winform.picturebox.backgroundBitmap){ 
		winform.edit.text = "识别中 ..."
		winform.btnOcr.disabledText = ['\uF254','\uF251','\uF252','\uF253','\uF250',text='识别中 ...']
		
		thread.invoke(ocr,winform,winform.picturebox.backgroundBitmap.saveToBuffer("*.png"));
	}
	else {
		winform.msgErr("请先复制图像到剪贴板 / 或打开图像文件")
	} 
}

import fsys.dlg;
winform.btnOpen.oncommand = function(id,event){
	var path = fsys.dlg.open("图像文件|*.jpg;*.jpeg;*.jfif;*.bmp;*.gif;*.png;*.tif;*.tiff;*.webp||",,,winform)
	if(path){
		if(string.endsWith(path,".webp",true)){
			import gdip.webp;
		}
		winform.picturebox.background = path; 
		winform.picturebox.backgroundBitmap = gdip.bitmap(path);
		winform.picturebox.text = null;
        winform.picturebox.iconText = null;
	}
}

winform.lnkTranslate.oncommand = function(id,event){
	var text = string.trim(winform.edit.text);
	if(#text){
		import web.edgeTextToSpeech.translate; 
		var transForm = web.edgeTextToSpeech.translate(,text) 
		transForm.text = "OCRAPI 中英翻译 - 此页面支持英文划词速查";
		transForm.doModal();
	} 
	else {
		winform.msgErr("识别结果为空")
	} 
}

winform.onDropFiles = function(files){
	var path = files[1]
	if(path){
		if(string.endsWith(path,".webp",true)){
			import gdip.webp;
		}
		
		winform.picturebox.backgroundBitmap = gdip.bitmap(path);
		if(winform.picturebox.backgroundBitmap){
			winform.picturebox.background = path; 
		} 
	}
}

import win.clip.bitmap;
winform.btnPaste.oncommand = function(id,event){
	var bmp = win.clip.bitmap.read()
	if(bmp){ 
		winform.picturebox.backgroundBitmap = bmp;
		winform.picturebox.background = bmp;
		winform.picturebox.text = null;
        winform.picturebox.iconText = null;
	}
}

import win.clip.viewer;
winform.clipViewer = win.clip.viewer(winform);
winform.clipViewer.onDrawClipboard = function(){ 
	if(winform.screenclip){ 
		win.showForeground(winform.hwnd);
		winform.screenclip = false
	}
	winform.btnPaste.oncommand();
}
winform.btnPaste.oncommand()

winform.btnScreenClip.oncommand = function(id,event){
	winform.show(6/*_SW_MINIMIZE*/);
	winform.screenclip = true;
	
	import win.clip.screen;
	win.clip.screen();
}

winform.onActivate = function(state,hwndOther,minimized){
	if(state){
		winform.screenclip = false;		
	}
} 

winform.edit.enablePopMenu()

winform.splitter.split(winform.picturebox,winform.edit);

// 定义一个统一的按钮皮肤样式
var btnSkin = {
    color = {
        default = 0xFF3C3C3C; // 默认深灰色文本
        hover = 0xFF0078D4;   // 鼠标悬停变蓝色
        active = 0xFF005A9E;  // 鼠标按下变深蓝色
        disabled = 0xFFAAAAAA; // 禁用状态灰色
    };
    background = {
        hover = 0x1A0078D4;   // 悬停时淡淡的背景色
        active = 0x330078D4;  // 按下时稍深的背景色
    }
}

// 批量为所有按钮应用样式
for i,ctrl in [
    winform.btnPaste,
    winform.btnOcr,
    winform.btnOpen,
    winform.btnScreenClip
] {
    ctrl.skin(btnSkin);
}

winform.lnkTranslate.skin({
    color = {
        default = 0xFF3498DB;
        hover = 0xFF2980B9;
        active = 0xFF1F618D;
         disabled=0xFFAAAAAA;
    }
})

winform.editApiKey.setCueBannerText("请输入 API key");

import fsys.table;
var cfgTable = fsys.table(io.appData("aardio/example/ai/glm-ocr.talbe"));
winform.editApiKey.text = cfgTable.apiKey;
winform.onDestroy = function(){
    cfgTable.apiKey = winform.editApiKey.text;
    cfgTable.save();
}

winform.show();
win.loopMessage();
```