这是一款带界面的在线OCR工具,设置的是F1调用截图并OCR识别。可自行修改代码使用。
整合包下载地址:
调用API的代码片段:
; 注册申请地址:https://ai.baidu.com/tech/ocr/?_=1693157696507 ; 240415的每月免费配额是,通用文字识别:普通精度 和 高精度。每个月各1000次 #Persistent #SingleInstance, Ignore #Include <JSON> #Include <Gdip> ; Tray Menu Menu, Tray, Icon, Shell32.dll, 260 Menu, Tray, NoStandard Menu, Tray, Tip, Screenshot OCR Menu, Tray, Click, 1 Menu, Tray, Add, 设置, Show_st Menu, Tray, Default, 设置 Menu, Tray, Add, 开启OCR, Get_tk Menu, Tray, Add, 动图显示, DSSwitch Menu, Tray, Add, 重启, ReloadSub Menu, Tray, Add, 退出, ExitSub ; AHK脚本以管理员权限自启 if !A_IsAdmin && !RegExMatch(_:=DllCall("GetCommandLineW", "Str"), " /restart(?!\S)") RunWait % "*RunAs " RegExReplace(_, "^\"".*?\""\K|^\S*\K", " /restart") Global OverlayFlag, pToken, token, BDflag := 0, BDflag2 := 0, DS := 1, stHwnd, Ls, _Ex:=[], _Tp:=[] Global BD_Configfile:=A_ScriptDir "\Config.ini" create_st:=1 Gosub create_st ; Load Config if !FileExist(BD_Configfile) Gosub Create_Config _Se:=StrSplit(Readini(BD_Configfile),"`n") Loop % _Se.length() { _Ke:=StrSplit(Readini(BD_Configfile,"",_Se[A_Index]),"`n") Loop % _Ke.length() _Va:=StrSplit(_Ke[A_Index],"=") , tVar:=_Va[1] , %tVar%:=_Va[2] } Gosub Get_tk Return F1:: MypBitmap := ScreenCapture(TLX, TLY, BW, BH) ScreenSize := TLX "|" TLY "|" BW "|" BH if BDflag { if 强制保存 || (GetKeyState("Ctrl", "P") = 1) { FormatTime, TimeStamp, , yyyyMMdd_HHmmss Gdip_SaveBitmapToFile(MypBitmap, A_Desktop . "\" . TimeStamp . "." . 图片格式, 图片质量) } ; msgbox % clipboard := bdocr_Bitmap(MypBitmap, token) OSDTIP_Pop("OCR成功(内容已存入剪贴板)", clipboard := RTrim(bdocr_Bitmap(MypBitmap, token), "`n"), -3000) OSDTIP_Pop("OCR成功(内容已存入剪贴板)", clipboard := bdocr_Bitmap(MypBitmap, token), -2000) } else { if 强制保存 || (GetKeyState("Ctrl", "P") = 1) { FormatTime, TimeStamp, , yyyyMMdd_HHmmss Gdip_SaveBitmapToFile(MypBitmap, A_Desktop . "\" . TimeStamp . "." . 图片格式, 图片质量) } else Gdip_SetBitmapToClipboard(MypBitmap) } DeleteObject(MypBitmap) Gdip_DisposeImage(MypBitmap) Gdip_Shutdown(pToken) Send {LWin Up} Return ; #F3:: 图片格式:=Readini(BD_Configfile, "图片格式", "IMAGE") 图片质量:=Readini(BD_Configfile, "图片质量", "IMAGE") MypBitmap := BitmapFromRect(ScreenPass) if BDflag { if (GetKeyState("Ctrl", "P") = 1) { FormatTime, TimeStamp, , yyyyMMdd_HHmmss Gdip_SaveBitmapToFile(MypBitmap, A_Desktop . "\" . TimeStamp . "." . 图片格式, 图片质量) } OSDTIP_Pop("OCR成功(内容已存入剪贴板)", clipboard := RTrim(bdocr_Bitmap(MypBitmap, token), "`n"), -3000) ; msgbox % clipboard := bdocr_Bitmap(MypBitmap, token) } else { FormatTime, TimeStamp, , yyyyMMdd_HHmmss Gdip_SaveBitmapToFile(MypBitmap, A_Desktop . "\" . TimeStamp . "." . 图片格式, 图片质量) } DeleteObject(MypBitmap) Gdip_DisposeImage(MypBitmap) Gdip_Shutdown(pToken) Return ; 更多类似显示函数:https://www.autohotkey.com/boards/viewtopic.php?f=6&t=76881 OSDTIP_Pop(P*) { ; OSDTIP_Pop v0.55 by SKAN on D361/D36E @ tiny.cc/osdtip Local Static FN:=PM:=PS:="", ID:=0 (!IsObject(FN) && FN := Func(A_ThisFunc).Bind(A_ThisFunc) ) if (P.Count()=0 || P[1]==A_ThisFunc) { ; 点击窗口或时间到时进入 OnMessage(0x202, FN, 0), OnMessage(0x010, FN, 0) ; WM_LBUTTONUP, WM_CLOSE SetTimer, %FN%, OFF DllCall("AnimateWindow", "Ptr",ID, "Int",200, "Int",0x50004) ; AW_VER_POSITIVE | AW_SLIDE Progress, 10:OFF ; | AW_HIDE Return ID:=0 } MT:=P[1], ST:=P[2], TMR:=P[3], OP:=P[4], FONT:=P[5] ? P[5] : "Microsoft YaHei UI" , Title := (TMR=0 ? "0x0" : A_ScriptHwnd) . ":" . A_ThisFunc if (ID) { Progress, 10:, % (ST=PS ? "" : PS:=ST), % (MT=PM ? "" : PM:=MT), %Title% OnMessage(0x202, FN, TMR=0 ? 0 : -1) SetTimer, %FN%, % Round(TMR)<0 ? TMR : "OFF" Return ID } if ( InStr(OP,"U2",1) && FileExist(WAV:=A_WinDir . "\Media\Windows Notify.wav") ) DllCall("winmm\PlaySoundW", "WStr",WAV, "Ptr",0, "Int",0x220013) ; SND_FILENAME | SND_ASYNC ; | SND_NODEFAULT DetectHiddenWindows, % ("On", DHW:=A_DetectHiddenWindows) ; | SND_NOSTOP | SND_SYSTEM SetWinDelay, % (-1, SWD:=A_WinDelay) DllCall("uxtheme\SetThemeAppProperties", "Int",0) ; 通过StrLen判断汉字优化上下间距 Progress, % "10: C00 ZH0 FM11 FS10 CW212121 CTE9E9E9 M B W340 " ((StrLen(P[1] P[2]) = StrPut(P[1] P[2], "utf-8") - 1) ? "ZX24 ZY14" : "ZX18 ZY12") " " OP " HIDE",% PS:=ST,% PM:=MT, %Title%, %FONT% DllCall("uxtheme\SetThemeAppProperties", "Int", 7) ; STAP_ALLOW_NONCLIENT | STAP_ALLOW_CONTROLS WinWait, %Title% ahk_class AutoHotkey2 ; | STAP_ALLOW_WEBCONTENT WinGetPos, X, Y, W, H SysGet, M, MonitorWorkArea WinMove,% "ahk_id" . WinExist(),,% (MRight-W)-8*A_ScreenDPI/96,% (MBottom-(H:=InStr(OP,"U1",1) ? H : Max(H,100)))-8*A_ScreenDPI/96, W, H WinSet, Region, % "w" W*A_ScreenDPI//96 " h" H*A_ScreenDPI//96 " 0-0 r4-4", %Title% ahk_class AutoHotkey2 ; 圆角矩形 WinSet, Transparent, % Round(P[6]) ? P[6] & 255 : 249 ControlGetPos,,,,H, msctls_progress321 if (H>2) { ColorMQ:=Round(P[7]), ColorBG:=P[8]!="" ? Round(P[8]) : 0xF0F0F0, SpeedMQ:=Round(P[9]) Control, ExStyle, -0x20000, msctls_progress321 ; v0.55 WS_EX_STATICEDGE Control, Style, +0x8, msctls_progress321 ; PBS_MARQUEE SendMessage, 0x040A, 1, %SpeedMQ%, msctls_progress321 ; PBM_SETMARQUEE SendMessage, 0x0409, 1, %ColorMQ%, msctls_progress321 ; PBM_SETBARCOLOR SendMessage, 0x2001, 1, %ColorBG%, msctls_progress321 ; PBM_SETBACKCOLOR } DllCall("AnimateWindow", "Ptr", WinExist(), "Int", 200, "Int", 0x40008) ; AW_VER_NEGATIVE | AW_SLIDE SetWinDelay, %SWD% DetectHiddenWindows, %DHW% if (Round(TMR)<0) SetTimer, %FN%, %TMR% OnMessage(0x202, FN, TMR=0 ? 0 : -1), OnMessage(0x010, FN) ; WM_LBUTTONUP, WM_CLOSE Return ID:=WinExist() } SetSystemCursor(Cursor="") { ; 设置光标 Static SystemCursors := "32512IDC_ARROW|32513IDC_IBEAM|32514IDC_WAIT|32515IDC_CROSS|32516IDC_UPARROW|32642IDC_SIZENWSE|32643IDC_SIZENESW|32644IDC_SIZEWE|32645IDC_SIZENS|32646IDC_SIZEALL|32648IDC_NO|32649IDC_HAND|32650IDC_APPSTARTING|32651IDC_HELP" If (Cursor = "") Return DllCall("SystemParametersInfo", "UInt", 0x57, "UInt", 0, "UInt", 0, "UInt", 0) ; SPI_SETCURSORS := 0x57 If (StrLen(SystemCursors) = 221) Loop, Parse, SystemCursors, | StringReplace, SystemCursors, SystemCursors, %A_LoopField%, % DllCall("LoadCursor", "UInt", 0, "Int", SubStr(A_LoopField, 1, 5)) A_LoopField If !(Cursor := SubStr(SystemCursors, InStr(SystemCursors "|", "IDC_" Cursor "|") - 5 - p := (StrLen(SystemCursors) - 221) / 14, 5)) MsgBox, 262160, %A_ScriptName% - %A_ThisFunc%(): Error, 无效的指针名字! Else Loop, Parse, SystemCursors, | DllCall("SetSystemCursor", "UInt", DllCall("CopyIcon", "UInt", Cursor), "Int", SubStr(A_LoopField, 6, p)) } BitmapFromRect(ByRef ScreenPass := "") { if (ScreenPass = "") { MypBitmap := ScreenCapture(TLX, TLY, BW, BH) ScreenPass := TLX "|" TLY "|" BW "|" BH } else { if (!pToken := Gdip_Startup()) { msgbox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system ExitApp } MypBitmap := Gdip_BitmapFromScreen(ScreenPass) S := StrSplit(ScreenPass, "|") BW := S[3], BH := S[4] _Alpha:=Readini(BD_Configfile, "保留透明度", "IMAGE") if !_Alpha { NewpBitmap := Gdip_CloneBitmapArea(MypBitmap, 0, 0, BW, BH, 0x21808) DeleteObject(MypBitmap) Gdip_DisposeImage(MypBitmap) MypBitmap := NewpBitmap } } Return MypBitmap } ; User defined box and the dimensions ScreenCapture(ByRef TopLeftX, ByRef TopLeftY, ByRef XWidth, ByRef YHeight) ;This function needs to Return the coords of the top left corner x/y of the square and bottom right corner x/y of the square { CoordMode, ToolTip, Screen CoordMode, Pixel, Screen CoordMode, Mouse, Screen SysGet, X0, 76 SysGet, Y0, 77 SysGet, Width, 78 SysGet, Height, 79 WS_EX_LAYERED := 0x00080000 ;positioned here for ease of GDI+ use WS_EX_NOACTIVATE := 0x08000000 ;ToolWindow ; { ;generate GUI to cover the active window so you don't play with things in it while you select your box. Gui, 1: +LastFound -Caption +AlwaysOnTop +ToolWindow Gui, 1: Show, Hide WinSet, Transparent, 1 Gui, 1: Show, NA x%X0% y%Y0% w%Width% h%Height% OverlayFlag := 1 ;Generate the GDI+ Gui, 2: +LastFound -Caption +AlwaysOnTop +E%WS_EX_LAYERED% +E%WS_EX_NOACTIVATE% Gui, 2: Show, NA ;Wait for the left mouse button to start the GDI+ ;KeyWait, LButton, D if (!pToken := Gdip_Startup()) { msgbox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system ExitApp } SetSystemCursor("CROSS") hwnd1 := WinExist() hbm := CreateDIBSection(Width, Height) hdc := CreateCompatibleDC() obm := SelectObject(hdc, hbm) G := Gdip_GraphicsFromHDC(hdc) Gdip_SetSmoothingMode(G, 4) pPen := Gdip_CreatePen(0xff00aeff, 4) TopLeftX := X0, TopLeftY := Y0, XWidth := Width, YHeight := Height if DS { MypBitmap := Gdip_BitmapFromScreen(0 "|" 0 "|" Width "|" Height) Gdip_DrawImage(G, MypBitmap, TopLeftX, TopLeftY, Width, Height, TopLeftX, TopLeftY, Width, Height) ;静态展示 } Gdip_DrawRoundedRectangle(G, pPen, 0, 0, Width-1, Height-1, 1) UpdateLayeredWindow(hwnd1, hdc, X0, Y0, Width, Height) SelectObject(hdc, obm) DeleteObject(hbm) DeleteDC(hdc) Gdip_DeleteGraphics(G) Gdip_DeletePen(pPen) Tooltip %Width% x %Height%, 0, 0 while (GetKeyState("LButton", "P") = 0) { MouseGetPos, NewMX, NewMY if !((NewMX=OldMX)&&(NewMY=OldMY)) { OldMX := NewMX OldMY := NewMY if DS { hwnd1 := WinExist() hbm := CreateDIBSection(Width, Height) hdc := CreateCompatibleDC() obm := SelectObject(hdc, hbm) G := Gdip_GraphicsFromHDC(hdc) Gdip_SetSmoothingMode(G, 4) Gdip_SetInterpolationMode(G, 7) pPen := Gdip_CreatePen(0xff00aeff, 4) pPen1 := Gdip_CreatePen(0xff00aeff, 1) hbm2 := CreateDIBSection(Width, Height) hdc2 := CreateCompatibleDC() obm2 := SelectObject(hdc2, hbm2) G2 := Gdip_GraphicsFromHDC(hdc2) Gdip_DrawImage(G2, MypBitmap, 0, 0, Width, Height, 0, 0, Width, Height) pPen1 := Gdip_CreatePen(0x9fb2d3fa, 1) Gdip_DrawLine(G2, pPen1, NewMX, NewMY - 12, NewMX, NewMY + 12) Gdip_DrawLine(G2, pPen1, NewMX - 12, NewMY, NewMX + 12, NewMY) Gdip_DrawImage(G, MypBitmap, 0, 0, Width, Height, 0, 0, Width, Height) ;静态展示 Gdip_DrawImage(G, MypBitmap, TopLeftX, TopLeftY, XWidth, YHeight, TopLeftX, TopLeftY, XWidth, YHeight) ; StretchBlt(hdc, TopLeftX, TopLeftY, XWidth, YHeight, hdc2, TopLeftX, TopLeftY, XWidth, YHeight) Gdip_DrawRoundedRectangle(G, pPen, 0, 0, Width-1, Height-1, 1) ;蓝色边框 ; StretchBlt(hdc, NewMX + 15, NewMY + 25, 126, 126, hdc2, NewMX - 10, NewMY - 10, 21, 21) ; 像素放大镜 ; pPen2 := Gdip_CreatePen(0xff000000, 1) ; Gdip_DrawLine(G, pPen2, NewMX + 14, NewMY + 24, NewMX + 141, NewMY + 24) ; Gdip_DrawLine(G, pPen2, NewMX + 14, NewMY + 24, NewMX + 14, NewMY + 151) ; Gdip_DrawLine(G, pPen2, NewMX + 141, NewMY + 24, NewMX + 141, NewMY + 151) ; Gdip_DrawLine(G, pPen2, NewMX + 14, NewMY + 151, NewMX + 141, NewMY + 151) UpdateLayeredWindow(hwnd1, hdc, X0, Y0, Width, Height) SelectObject(hdc2, obm2) DeleteObject(hbm2) DeleteDC(hdc2) Gdip_DeleteGraphics(G2) SelectObject(hdc, obm) DeleteObject(hbm) DeleteDC(hdc) Gdip_DeleteGraphics(G) Gdip_DeletePen(pPen) Gdip_DeletePen(pPen1) Gdip_DeletePen(pPen2) } } if (GetKeyState("RButton", "P") = 1)or(GetKeyState("Esc", "P") = 1) { if (GetKeyState("RButton", "P") = 1) KeyWait, RButton, up Tooltip Gui, 2:Destroy DeleteObject(MypBitmap) Gdip_DisposeImage(MypBitmap) Gdip_Shutdown(pToken) Gui, 1:Destroy OverlayFlag := 0 SetSystemCursor() exit } } MouseGetPos, MX, MY OldMX := MX, OldMY := MY Loop { MouseGetPos, NewMX, NewMY if !(abs(NewMX-MX) + abs(NewMY-MY) < 6) if !((NewMX=OldMX)&&(NewMY=OldMY)) { OldMX := NewMX OldMY := NewMY xw := abs(NewMX-MX) yh := abs(NewMY-MY) XWidth := xw + 1 YHeight := yh + 1 Tooltip %XWidth% x %YHeight%, TopLeftX := (MX < NewMX ? MX : NewMX) ,(TopLeftY := (MY < NewMY ? MY : NewMY)) -30 hwnd1 := WinExist() hbm := CreateDIBSection(Width, Height) hdc := CreateCompatibleDC() obm := SelectObject(hdc, hbm) G := Gdip_GraphicsFromHDC(hdc) Gdip_SetSmoothingMode(G, 4) pPen := Gdip_CreatePen(0xff00aeff, 3) ;蓝色边框 pBrush := Gdip_BrushCreateSolid(0x8f000000) ;灰色遮罩 if DS { hbm2 := CreateDIBSection(Width, Height) hdc2 := CreateCompatibleDC() obm2 := SelectObject(hdc2, hbm2) G2 := Gdip_GraphicsFromHDC(hdc2) Gdip_DrawImage(G2, MypBitmap, 0, 0, Width, Height, 0, 0, Width, Height) pPen1 := Gdip_CreatePen(0x9fb2d3fa, 1) Gdip_DrawLine(G2, pPen1, NewMX, NewMY - 10, NewMX, NewMY + 10) Gdip_DrawLine(G2, pPen1, NewMX - 10, NewMY, NewMX + 10, NewMY) Gdip_DrawImage(G, MypBitmap, 0, 0, Width, Height, 0, 0, Width, Height) ;静态展示 Gdip_FillRoundedRectangle(G, pBrush, 0, 0, Width, Height, 1) Gdip_DrawImage(G, MypBitmap, TopLeftX, TopLeftY, XWidth, YHeight, TopLeftX, TopLeftY, XWidth, YHeight) ; StretchBlt(hdc, TopLeftX, TopLeftY, XWidth, YHeight, hdc2, TopLeftX, TopLeftY, XWidth, YHeight) Gdip_DrawRoundedRectangle(G, pPen, TopLeftX - 2, TopLeftY - 2, XWidth + 3, YHeight + 3, 2) ;蓝色边框 ; StretchBlt(hdc, NewMX + 15, NewMY + 25, 126, 126, hdc2, NewMX - 10, NewMY - 10, 21, 21) ; 像素放大镜 ; pPen2 := Gdip_CreatePen(0xff000000, 1) ; Gdip_DrawLine(G, pPen2, NewMX + 14, NewMY + 24, NewMX + 141, NewMY + 24) ; Gdip_DrawLine(G, pPen2, NewMX + 14, NewMY + 24, NewMX + 14, NewMY + 151) ; Gdip_DrawLine(G, pPen2, NewMX + 141, NewMY + 24, NewMX + 141, NewMY + 151) ; Gdip_DrawLine(G, pPen2, NewMX + 14, NewMY + 151, NewMX + 141, NewMY + 151) UpdateLayeredWindow(hwnd1, hdc, X0, Y0, Width, Height) SelectObject(hdc2, obm2) DeleteObject(hbm2) DeleteDC(hdc2) Gdip_DeleteGraphics(G2) } else { wdc := GetDC(hwnd1) Gdip_FillRoundedRectangle(G, pBrush, 0, 0, Width, Height, 1) StretchBlt(hdc, TopLeftX, TopLeftY, XWidth, YHeight, wdc, TopLeftX, TopLeftY, XWidth, YHeight) ;透明遮罩 Gdip_DrawRoundedRectangle(G, pPen, TopLeftX - 1, TopLeftY - 1, XWidth + 1, YHeight + 1, 2) ;蓝色边框 ReleaseDC(wdc, hwnd1) UpdateLayeredWindow(hwnd1, hdc, X0, Y0, Width, Height) } SelectObject(hdc, obm) DeleteObject(hbm) DeleteDC(hdc) Gdip_DeleteGraphics(G) Gdip_DeletePen(pPen) Gdip_DeleteBrush(pBrush) } if (GetKeyState("LButton", "P") = 0) { Break } if (GetKeyState("RButton", "P") = 1)or(GetKeyState("Esc", "P") = 1) { if (GetKeyState("RButton", "P") = 1) KeyWait, RButton, up Tooltip Gui, 2:Destroy DeleteObject(MypBitmap) Gdip_DisposeImage(MypBitmap) Gdip_Shutdown(pToken) Gui, 1:Destroy OverlayFlag := 0 SetSystemCursor() exit } } Tooltip Gui, 2:Destroy Gui, 1:Destroy OverlayFlag := 0 sleep 10 SetSystemCursor() if DS { NewpBitmap := (保留透明度 ? Gdip_CloneBitmapArea(MypBitmap, TopLeftX, TopLeftY, XWidth, YHeight) : Gdip_CloneBitmapArea(MypBitmap, TopLeftX, TopLeftY, XWidth, YHeight, 0x21808)) DeleteObject(MypBitmap) Gdip_DisposeImage(MypBitmap) Return NewpBitmap } else { MypBitmap := Gdip_BitmapFromScreen(TopLeftX "|" TopLeftY "|" XWidth "|" YHeight) if !保留透明度 { NewpBitmap := Gdip_CloneBitmapArea(MypBitmap, 0, 0, XWidth, YHeight, 0x21808) DeleteObject(MypBitmap) Gdip_DisposeImage(MypBitmap) Return NewpBitmap } else Return MypBitmap } } Dlg_Color(ByRef Color, hGui=0) ;调用系统颜色对话框 { clr := ((Color & 0xFF) << 16) + (Color & 0xFF00) + ((Color >> 16) & 0xFF) VarSetCapacity(CHOOSECOLOR, 0x24, 0), VarSetCapacity(CUSTOM, 64, 0) ,NumPut(0x24, CHOOSECOLOR, 0) ; DWORD lStructSize ,NumPut(hGui, CHOOSECOLOR, 4) ; HWND hwndOwner (makes dialog "modal"). ,NumPut(clr, CHOOSECOLOR, 12) ; clr.rgbResult ,NumPut(&CUSTOM, CHOOSECOLOR, 16) ; COLORREF *lpCustColors ,NumPut(0x00000103,CHOOSECOLOR, 20) ; Flag: CC_ANYCOLOR || CC_RGBINIT nRC := DllCall("comdlg32\ChooseColor", str, CHOOSECOLOR) ; Display the dialog. if (errorlevel <> 0) || (nRC = 0) return false clr := NumGet(CHOOSECOLOR, 12) oldFormat := A_FormatInteger SetFormat, integer, hex ; Show RGB color extracted below in hex format. Color := (clr & 0xff00) + ((clr & 0xff0000) >> 16) + ((clr & 0xff) << 16) ;convert to rgb StringTrimLeft, Color, Color, 2 loop, % 6-strlen(Color) Color=0%Color% Color=%Color% SetFormat, integer, %oldFormat% return true } ToolTipOff: ToolTip Return Help: MsgBox, 64, 使用说明,%文本类型说明% Return Create_Config: IniWrite, % "", %BD_Configfile%, BDOCR, API_Key IniWrite, % "", %BD_Configfile%, BDOCR, Secret_Key IniWrite, % "", %BD_Configfile%, BDOCR, BD_token IniWrite, general_basic, %BD_Configfile%, BDOCR, 识别类型 IniWrite, 0 , %BD_Configfile%, BDOCR, 保留换行 IniWrite, 0, %BD_Configfile%, BDOCR, 保留空格 FileAppend, `n, %BD_Configfile% IniWrite, jpg, %BD_Configfile%, IMAGE, 图片格式 IniWrite, 75, %BD_Configfile%, IMAGE, 图片质量 IniWrite, 0, %BD_Configfile%, IMAGE, 保留透明度 IniWrite, 0, %BD_Configfile%, IMAGE, 强制保存 return Create_st: global cz:=0 Gui, st:Default Gui, st:+ToolWindow +AlwaysOnTop +HwndstHwnd Gui, st:Margin, 10, 10 ; Gui, st:Color, DDEEFF Gui, st:Font, s10, Verdana Gui, Add, Tab3, x10 y10 w220 h215, Ocr|截图 Gui, Tab, Ocr Gui, Add, Text, xm x15 y+10 w80 h20 +Right, API_Key Gui, Add, Edit, x+5 w120 h20 vAPI_Key gGETV Gui, Add, Text, xm x15 y+10 w80 h20 +Right, Secret_Key Gui, Add, Edit, x+5 w120 h20 vSecret_Key gGETV Gui, Add, Text, xm x15 y+10 w80 h20 +Right, BD_token Gui, Add, Edit, x+5 w120 h20 vBD_token gGETV Gui, Add, Text, xm x15 y+10 w80 h20 +Right, 识别类型 Gui, Add, DropDownList, x+5 w120 h20 v识别类型 r4 gGETV AltSubmit, 通用文字|高精度|手写文字|网络图片文字 Gui, Add, Text, xm x15 y+10 w80 h20 +Right, 保留换行 Gui, Add, Checkbox, x+5 w120 h20 v保留换行 gGETV Gui, Add, Text, xm x15 y+10 w80 h20 +Right, 保留空格 Gui, Add, Checkbox, x+5 w120 h20 v保留空格 gGETV Gui, Tab, 截图 Gui, Add, Text, xm x15 y+10 w80 h20 +Right, 图片格式 Gui, Add, DropDownList, x+5 w120 h20 v图片格式 r5 gGETV AltSubmit, bmp|jpg|gif|tif|png Gui, Add, Text, xm x15 y+10 w80 h20 +Right, 图片质量 Gui, Add, Edit, x+5 w120 h20 v图片质量 Limit3 number gGETV Gui, Add, UpDown, Range1-100 Gui, Add, Text, xm x15 y+10 w80 h20 +Right, 保留透明度 Gui, Add, Checkbox, x+5 w120 h20 v保留透明度 gGETV Gui, Add, Text, xm x15 y+10 w80 h20 +Right, 强制保存 Gui, Add, Checkbox, x+5 w120 h20 v强制保存 gGETV Onmessage(0x18,"WM_SHOWWINDOW") Gui, st:Show, Hide, 设置 Return Show_st: if !FileExist(BD_Configfile) gosub Create_Config Gui, st:Show, NA, 设置 Return GETV: GuiControlGet, tVa, , % A_GuiControl if A_GuiControl = 图片格式 tVa:=_Ex[tVa] else if A_GuiControl = 识别类型 tVa:=_Tp[tVa] else if A_GuiControl = 图片质量 { if tVa > 100 { tVa:=100, GuiControl,, % A_GuiControl, %tVa% } } %A_GuiControl%:=tVa if cz Writeini(BD_Configfile, tVa, A_GuiControl, (RegExMatch(A_GuiControl, "^(?i:图片格式|图片质量|保留透明度|强制保存)$") ? "IMAGE" : "BDOCR")) return WM_SHOWWINDOW(wParam, lParam, msg, hwnd) { if % hwnd = sthwnd && wParam { Gui, st:Show, NA, 设置 ControlFocus,, ahk_id %stHwnd% WinGet, ListC, ControlListHwnd, ahk_id %sthwnd% C_S:=StrSplit(ListC,"`n") Global N_:=[],C_:=[] N_len:=0 loop % C_S.length() { GuiControlGet, cName, Name, % C_S[A_index] if cName { N_[N_len+=1]:=cName C_[N_len]:=C_S[A_index] } } C_S = global _Ex:=["bmp","jpg","gif","tif","png"] global _Tp:=["general_basic","accurate_basic","handwriting","webimage"] loop % N_len { tt:=Readini(BD_Configfile, N_[A_index], (RegExMatch(N_[A_index], "^(?i:图片格式|图片质量|保留透明度|强制保存)$") ? "IMAGE" : "BDOCR")) ; tVar:=N_[A_index] ; %tVar%:=tt if % N_[A_index] = "图片格式" { loop % _Ex.length() { if _Ex[A_index] = tt GuiControl, Choose, 图片格式, % A_index, break } Continue } else if % N_[A_index] = "识别类型" { loop % _Tp.length() { if _Tp[A_index] = tt GuiControl, Choose, 识别类型, % A_index, break } Continue } if tt != ERROR GuiControl,, % C_[A_index], %tt% } cz:=1 } if % hwnd = sthwnd && !wParam WinClose, 设置 } Readini(_BD_Configfile, _key:="", _Section:="") { if FileExist(_BD_Configfile) { Iniread, initmp, %_BD_Configfile%, %_Section%, %_key% return initmp } } Writeini(_BD_Configfile, _value, _key, _Section:="Config") { if _value != IniWrite, %_value%, %_BD_Configfile%, %_Section%, %_key% } Get_token(BD_Key,BD_Secret) { BD_access_token := Readini(BD_Configfile, "BD_token", "BDOCR") if BD_access_token && (Get_Ocr("/9j/4AAQSkZJRgABAQEAYABgAAD//gAUU29mdHdhcmU6IFNuaXBhc3Rl/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAAQABAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/VOiiigD/9k=", BD_access_token) != "image size error") return BD_access_token BD_Url := "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials" BD_Url := BD_Url "&client_id=" BD_Key "&client_secret=" BD_Secret BD_Json := JSON.Load(URLDownloadToVar(BD_Url)) BD_access_token := BD_Json.access_token ; msgbox % BD_access_token "|" BD_Key if BD_access_token { IniWrite, %BD_access_token%, %BD_Configfile%, BDOCR, BD_token return BD_access_token } } bdocr(Address, BD_access_token, txttype := "") { if !txttype if tmp := Readini(BD_Configfile, "识别类型", "BDOCR") txttype := tmp else txttype := "general_basic" Fileread, tpic, *c %Address% FileGetSize, tbt, %Address% image:=bintobase64(&tpic, tbt) return Get_Ocr(image, BD_access_token, txttype) } bdocr_Bitmap(pBitmap, BD_access_token, Extension:="jpg", Quality:=75, txttype := "") { if !txttype if tmp := Readini(BD_Configfile, "识别类型", "BDOCR") txttype := tmp else txttype := "general_basic" image:=BitmapToBase64(pBitmap, Extension, Quality) return Get_Ocr(image, BD_access_token, txttype) } Get_Ocr(imgBase64, BD_access_token, txttype:="general_basic") { BD_Url := "https://aip.baidubce.com/rest/2.0/ocr/v1/" txttype "?access_token=" BD_access_token postdata := "image=" urlencode(imgBase64) BD_ReturnTxt := URLDownloadToVar(BD_Url, "UTF-8", "POST", postdata, {"Content-Type":"application/x-www-form-urlencoded"}) BD_Json := JSON.Load(BD_ReturnTxt) if BD_Json.error_msg != "" return BD_Json.error_msg wordsC := BD_Json.words_result_num hh := Readini(BD_Configfile, "保留换行", "BDOCR") if wordsC > 1 { Loop % wordsC { txtmp .= BD_Json.words_result[A_Index].words if hh txtmp .= "`n" } if !Readini(BD_Configfile, "保留空格", "BDOCR") StringReplace, txtmp, txtmp, %A_Space%,,1 return txtmp } else { Return BD_Json.words_result[1].words } Return 0 } URLDownloadToVar(url, Encoding = "", Method="GET", postData="", headers:="") { hObject:=ComObjCreate("WinHttp.WinHttpRequest.5.1") hObject.SetTimeouts(30000, 30000, 1200000, 1200000) try hObject.Open(Method, url, (Method="POST" ? True : False)) if IsObject(headers) { for k, v in headers { if v hObject.SetRequestHeader(k, v) } } if postData { try hObject.Send(postData) hObject.WaitForResponse(-1) } else { try hObject.Send() } if (Encoding && hObject.ResponseBody) { oADO := ComObjCreate("adodb.stream") oADO.Type := 1 oADO.Mode := 3 oADO.Open() oADO.Write(hObject.ResponseBody) oADO.Position := 0 oADO.Type := 2 oADO.Charset := Encoding return oADO.ReadText(), oADO.Close() } try return hObject.ResponseText } BinToBase64(binpointer, bytes, Flags:=0x40000001) { DllCall("crypt32\CryptBinaryToString", "Ptr", binpointer, "Uint", bytes, "Uint", Flags, "Ptr", 0, "Uint*", nSize) VarSetCapacity(sString, nSize*2) DllCall("crypt32\CryptBinaryToString", "Ptr", binpointer, "Uint", bytes, "Uint", Flags, "str", sString, "Uint*", nSize) return StrGet(&sString, (A_IsUnicode ? "utf-16" : "cp0")) } StreamToBase64(pStream) { Ptr:=A_PtrSize ? "UPtr" : "UInt" DllCall("ole32\GetHGlobalFromStream", Ptr, pStream, "ptr*", hMemory) pMemory:=DllCall("GlobalLock", Ptr, hMemory, Ptr) pSize:=DllCall("GlobalSize", Ptr, hMemory, Ptr) DllCall("GlobalUnlock", Ptr, hMemory) return BinToBase64(pMemory,pSize) } BitmapToBase64(pBitmap, Extension:="jpg", Quality:=75) { return StreamToBase64(pStream:=Gdip_SaveBitmapToStream(pBitmap, Extension, Quality)),ObjRelease(pStream) } AnsiToUTF8(sString) { AnsiToUnicode(sString, 0, wString) UnicodeToAnsi(wString, 65001, zString) return zString } AnsiToUnicode(ByRef sString, CP=0, ByRef wString="") { nSize:=DllCall("MultiByteToWideChar", "Uint", CP, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0) VarSetCapacity(wString, nSize * 2) DllCall("MultiByteToWideChar", "Uint", CP, "Uint", 0, "Uint", &sString, "int", -1, "str", wString, "int", nSize) return strget(&wString, "utf-16") } UnicodeToAnsi(ByRef wString, CP=0, ByRef sString="") { nSize:=DllCall("WideCharToMultiByte", "Uint", CP, "Uint", 0, "Uint", &wString, "int", -1, "Uint", 0, "int", 0, "Uint", 0, "Uint", 0) VarSetCapacity(sString, nSize) DllCall("WideCharToMultiByte", "Uint", CP, "Uint", 0, "Uint", &wString, "int", -1, "str", sString, "int", nSize, "Uint", 0, "Uint", 0) return sString } StrPutVar(sVar, ByRef sbin, encoding) { VarSetCapacity(sbin, StrPut(sVar, encoding)* ((encoding="utf-16"||encoding="cp1200") ? 2 : 1)) return (StrPut(sVar, &sbin, encoding) -1)* ((encoding="utf-16"||encoding="cp1200") ? 2 : 1) } Urlencode(string, encoding:="utf-8") { bt:=StrPutVar(string,sb,encoding) Loop % bt { hex:=format("{1:02x}", hex2:=NumGet(&sb, A_index-1, "Uchar")) if hex2 if (hex2==33 || (hex2>=39 && hex2 <=42) || hex2==45 || hex2 ==46 || (hex2>=48 && hex2<=57) || (hex2>=65 && hex2<=90) || hex2==95 || (hex2>=97 && hex2<=122) || hex2==126) content .=Chr(hex2) else content .="`%" hex } return content } Get_tk: if !API_Key || !Secret_Key if !BD_token { Gui, st:Show, NA, 设置 WinwaitClose, ahk_id %stHwnd% } if token := Get_token(API_Key, Secret_Key) { BDflag := 1 Try Menu, Tray, Delete, 开启OCR ; MsgBox, 64, 使用说明, 图片的长和宽要求最小边长不小于15 px,最长边小于2048 px;`n图像编码后大小必须小于4M,建议不要超过1M。 } else { msgbox % token msgbox Access token无效,请检查API_Key、Secret_Key或BD_token BDflag2:=1 Gui, st:Show, NA, 设置 } Return DSSwitch: if DS := !DS { Menu, Tray, Delete, 静图显示 Menu, Tray, Delete, 重启 Menu, Tray, Delete, 退出 Menu, Tray, Add, 动图显示, DSSwitch Menu, Tray, Add, 重启, ReloadSub Menu, Tray, Add, 退出, ExitSub } else { Menu, Tray, Delete, 动图显示 Menu, Tray, Delete, 重启 Menu, Tray, Delete, 退出 Menu, Tray, Add, 静图显示, DSSwitch Menu, Tray, Add, 重启, ReloadSub Menu, Tray, Add, 退出, ExitSub } Return GuiEscape: MsgBox Gui, st:Hide return ReloadSub: Reload Return ExitSub: exitapp Return #if OverlayFlag ;屏蔽按键 UP:: DOWN:: LEFT:: RIGHT:: if (A_ThisHotKey = "UP") MouseMove, 0, -1, 0, R else if (A_ThisHotKey = "DOWN") MouseMove, 0, 1, 0, R else if (A_ThisHotKey = "LEFT") MouseMove, -1, 0, 0, R else if (A_ThisHotKey = "RIGHT") MouseMove, 1, 0, 0, R return Alt:: LWin::
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)