Post by wantop » 25 May 2023, 11:12
Code: Select all
BaiduOCR(img,client_id,client_secret) ;传入一个B64数据串 accurate是高精度文字识别带位置,然后改成 accurate_basic 不带位置的,就说我请求的参数错误。什么情况
{
whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
url:="https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" client_id "&client_secret=" client_secret "&"
whr.Open("Get", url)
whr.Send()
baidutoken:= whr.ResponseText ;返回一个令牌
baidutoken:=RegExReplace(baidutoken,".*(?<=access_token""\:"")(.*?)(?=""\,""scope).*","$1") ;按照格式提取令牌,此处用正则,可以用json,不懂
url:="https://aip.baidubce.com/rest/2.0/ocr/v1/accurate?access_token=" baidutoken ;加上这个令牌再发请求
whr.Open("POST", url)
whr.Send("image=" img ) ;发送具体的数据
whr.WaitForResponse() ;等待返回
oADO := ComObjCreate("adodb.stream") ;返回的数据需要格式化,否则乱码,不懂。
oADO.Type := 1
oADO.Mode := 3
oADO.Open()
oADO.Write(whr.ResponseBody)
oADO.Position := 0
oADO.Type := 2
oADO.Charset := "UTF-8"
res := oADO.ReadText()
oADO.Close()
return res
}
UrlEncode(str, enc:="UTF-8")
{
hex := "00"
fun := "msvcrt\swprintf"
VarSetCapacity(buff, size:=StrPut(str, enc))
StrPut(str, &buff, enc)
while(code:=NumGet(buff, A_Index - 1, "UChar")) && dllcall(fun, "str",hex, "str","%%%02X", "uchar",code, "cdecl")
r .= hex
return r
}
Gdip_EncodeBitmapTo64string(pBitmap, ext:="jpg", Quality:=75)
{ ;此函数来自vis,未做任何修改
if Ext not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
return -1
Extension := "." Ext
DllCall("gdiplus\GdipGetImageEncodersSize", "uint*", nCount, "uint*", nSize)
VarSetCapacity(ci, nSize)
DllCall("gdiplus\GdipGetImageEncoders", "uint", nCount, "uint", nSize, Ptr, &ci)
if !(nCount && nSize)
return -2
Loop, %nCount%
{
sString := StrGet(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), "UTF-16")
if !InStr(sString, "*" Extension)
continue
pCodec := &ci+idx
break
}
if !pCodec
return -3
if (Quality != 75)
{
Quality := (Quality < 0) ? 0 : (Quality > 100) ? 100 : Quality
if Extension in .JPG,.JPEG,.JPE,.JFIF
{
DllCall("gdiplus\GdipGetEncoderParameterListSize", Ptr, pBitmap, Ptr, pCodec, "uint*", nSize)
VarSetCapacity(EncoderParameters, nSize, 0)
DllCall("gdiplus\GdipGetEncoderParameterList", Ptr, pBitmap, Ptr, pCodec, "uint", nSize, Ptr, &EncoderParameters)
Loop, % NumGet(EncoderParameters, "UInt")
{
elem := (24+(A_PtrSize ? A_PtrSize : 4))*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
if (NumGet(EncoderParameters, elem+16, "UInt") = 1) && (NumGet(EncoderParameters, elem+20, "UInt") = 6)
{
p := elem+&EncoderParameters-pad-4
NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, "UInt")), "UInt")
break
}
}
}
}
DllCall("ole32\CreateStreamOnHGlobal", "ptr",0, "int",true, "ptr*",pStream)
DllCall("gdiplus\GdipSaveImageToStream", "ptr",pBitmap, "ptr",pStream, "ptr",pCodec, "uint",p ? p : 0)
DllCall("ole32\GetHGlobalFromStream", "ptr",pStream, "uint*",hData)
pData := DllCall("GlobalLock", "ptr",hData, "uptr")
nSize := DllCall("GlobalSize", "uint",pData)
VarSetCapacity(Bin, nSize, 0)
DllCall("RtlMoveMemory", "ptr",&Bin , "ptr",pData , "uint",nSize)
DllCall("GlobalUnlock", "ptr",hData)
DllCall(NumGet(NumGet(pStream + 0, 0, "uptr") + (A_PtrSize * 2), 0, "uptr"), "ptr",pStream)
DllCall("GlobalFree", "ptr",hData)
DllCall("Crypt32.dll\CryptBinaryToString", "ptr",&Bin, "uint",nSize, "uint",0x01, "ptr",0, "uint*",base64Length)
VarSetCapacity(base64, base64Length*2, 0)
DllCall("Crypt32.dll\CryptBinaryToString", "ptr",&Bin, "uint",nSize, "uint",0x01, "ptr",&base64, "uint*",base64Length)
Bin := ""
VarSetCapacity(Bin, 0)
VarSetCapacity(base64, -1)
return base64
}
Str_RegExMatchAll_tmp(ByRef Haystack, NeedleRegEx, SubPat:="",startPos := 1)
{
arr := []
while ( pos := RegExMatch(Haystack, NeedleRegEx, match, startPos) )
{
arr.push(match%SubPat%)
startPos := pos + StrLen(match)
}
return arr.MaxIndex() ? arr : ""
}
[code]BaiduOCR(img,client_id,client_secret) ;传入一个B64数据串 accurate是高精度文字识别带位置,然后改成 accurate_basic 不带位置的,就说我请求的参数错误。什么情况
{
whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
url:="https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" client_id "&client_secret=" client_secret "&"
whr.Open("Get", url)
whr.Send()
baidutoken:= whr.ResponseText ;返回一个令牌
baidutoken:=RegExReplace(baidutoken,".*(?<=access_token""\:"")(.*?)(?=""\,""scope).*","$1") ;按照格式提取令牌,此处用正则,可以用json,不懂
url:="https://aip.baidubce.com/rest/2.0/ocr/v1/accurate?access_token=" baidutoken ;加上这个令牌再发请求
whr.Open("POST", url)
whr.Send("image=" img ) ;发送具体的数据
whr.WaitForResponse() ;等待返回
oADO := ComObjCreate("adodb.stream") ;返回的数据需要格式化,否则乱码,不懂。
oADO.Type := 1
oADO.Mode := 3
oADO.Open()
oADO.Write(whr.ResponseBody)
oADO.Position := 0
oADO.Type := 2
oADO.Charset := "UTF-8"
res := oADO.ReadText()
oADO.Close()
return res
}
UrlEncode(str, enc:="UTF-8")
{
hex := "00"
fun := "msvcrt\swprintf"
VarSetCapacity(buff, size:=StrPut(str, enc))
StrPut(str, &buff, enc)
while(code:=NumGet(buff, A_Index - 1, "UChar")) && dllcall(fun, "str",hex, "str","%%%02X", "uchar",code, "cdecl")
r .= hex
return r
}
Gdip_EncodeBitmapTo64string(pBitmap, ext:="jpg", Quality:=75)
{ ;此函数来自vis,未做任何修改
if Ext not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
return -1
Extension := "." Ext
DllCall("gdiplus\GdipGetImageEncodersSize", "uint*", nCount, "uint*", nSize)
VarSetCapacity(ci, nSize)
DllCall("gdiplus\GdipGetImageEncoders", "uint", nCount, "uint", nSize, Ptr, &ci)
if !(nCount && nSize)
return -2
Loop, %nCount%
{
sString := StrGet(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), "UTF-16")
if !InStr(sString, "*" Extension)
continue
pCodec := &ci+idx
break
}
if !pCodec
return -3
if (Quality != 75)
{
Quality := (Quality < 0) ? 0 : (Quality > 100) ? 100 : Quality
if Extension in .JPG,.JPEG,.JPE,.JFIF
{
DllCall("gdiplus\GdipGetEncoderParameterListSize", Ptr, pBitmap, Ptr, pCodec, "uint*", nSize)
VarSetCapacity(EncoderParameters, nSize, 0)
DllCall("gdiplus\GdipGetEncoderParameterList", Ptr, pBitmap, Ptr, pCodec, "uint", nSize, Ptr, &EncoderParameters)
Loop, % NumGet(EncoderParameters, "UInt")
{
elem := (24+(A_PtrSize ? A_PtrSize : 4))*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
if (NumGet(EncoderParameters, elem+16, "UInt") = 1) && (NumGet(EncoderParameters, elem+20, "UInt") = 6)
{
p := elem+&EncoderParameters-pad-4
NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, "UInt")), "UInt")
break
}
}
}
}
DllCall("ole32\CreateStreamOnHGlobal", "ptr",0, "int",true, "ptr*",pStream)
DllCall("gdiplus\GdipSaveImageToStream", "ptr",pBitmap, "ptr",pStream, "ptr",pCodec, "uint",p ? p : 0)
DllCall("ole32\GetHGlobalFromStream", "ptr",pStream, "uint*",hData)
pData := DllCall("GlobalLock", "ptr",hData, "uptr")
nSize := DllCall("GlobalSize", "uint",pData)
VarSetCapacity(Bin, nSize, 0)
DllCall("RtlMoveMemory", "ptr",&Bin , "ptr",pData , "uint",nSize)
DllCall("GlobalUnlock", "ptr",hData)
DllCall(NumGet(NumGet(pStream + 0, 0, "uptr") + (A_PtrSize * 2), 0, "uptr"), "ptr",pStream)
DllCall("GlobalFree", "ptr",hData)
DllCall("Crypt32.dll\CryptBinaryToString", "ptr",&Bin, "uint",nSize, "uint",0x01, "ptr",0, "uint*",base64Length)
VarSetCapacity(base64, base64Length*2, 0)
DllCall("Crypt32.dll\CryptBinaryToString", "ptr",&Bin, "uint",nSize, "uint",0x01, "ptr",&base64, "uint*",base64Length)
Bin := ""
VarSetCapacity(Bin, 0)
VarSetCapacity(base64, -1)
return base64
}
Str_RegExMatchAll_tmp(ByRef Haystack, NeedleRegEx, SubPat:="",startPos := 1)
{
arr := []
while ( pos := RegExMatch(Haystack, NeedleRegEx, match, startPos) )
{
arr.push(match%SubPat%)
startPos := pos + StrLen(match)
}
return arr.MaxIndex() ? arr : ""
}[/code]