Posts: 726
Threads: 99
Joined: Mar 2018
05-06-2019, 10:00 PM
(This post was last modified: 05-06-2019, 10:42 PM by win .)
php code:
How to use PHP's base64 function? PHP code calls are much simpler
PHP Code:
$api = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=xxxxxxx' ; $header = [ 'Content-Length: multipart/form-data' ]; $file = '/data/image/a.png' ; // Local image path $image = base64_encode ( file_get_contents ( $file )); $post = [ 'image' => $image , ]; $res = request_post ( $api , $post , $header );
The garbled problem of unicode characters is still not solved
Can someone provide some methods? thanks
Posts: 726
Threads: 99
Joined: Mar 2018
05-06-2019, 11:03 PM
(This post was last modified: 05-06-2019, 11:13 PM by win .)
@redbull2k @Kevin
I solved the problem,
Do not use ResponseText
If you use the ResponseBody , there is no garbled
can make the code Shorter?
Macro
Macro8
typelib WinHttp {662901FC-6951-4854-9EB2-D9A2570F2B2E} 5.1
WinHttp. WinHttpRequest r._create
r.Open ( "POST" F "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic" )
r.setRequestHeader ( "content-type" , "application/x-www-form-urlencoded" )
r.SetRequestHeader ( "cache-control" , "no-cache" )
str access= "access_token=24.b305c9822131e65eda05e29c157dd719.2592000.1559103982.282335-16139329&image="
str sFile.getfile ( "$desktop$\3.png" ) ;; change to file location
_s.encrypt ( 4 sFile "" 2 )
_s.escape ( 9 )
r.Send ( F "{ access}{ _s}" )
ARRAY ( byte ) a= r.ResponseBody
str s.fromn ( & a[0 ] a.len )
out s
IXml x= JsonToXml ( s)
ARRAY ( IXmlNode ) a1; x.Path ( "root/words_result/item/words" a1 1 )
int i; for ( i 0 a1.len ) out a1[i].Value
Posts: 229
Threads: 22
Joined: Sep 2007
sometimes all it takes is a little longer patience and will you will find the answer.
Posts: 1,337
Threads: 61
Joined: Jul 2006
05-06-2019, 11:40 PM
(This post was last modified: 05-06-2019, 11:41 PM by Kevin .)
make code shorter no i don't think so, make it less lines yes .
for example
typelib WinHttp {662901FC-6951-4854-9EB2-D9A2570F2B2E} 5.1 ; WinHttp. WinHttpRequest r._create ; r.Open ( "POST" F "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic" ); r.setRequestHeader ( "content-type" , "application/x-www-form-urlencoded" ); r.SetRequestHeader ( "cache-control" , "no-cache" )
str access= "access_token=24.b305c9822131e65eda05e29c157dd719.2592000.1559103982.282335-16139329&image="
str sFile.getfile ( "$desktop$\3.png" ) ;; change to file location
_s.encrypt ( 4 sFile "" 2 ); _s.escape ( 9 ); r.Send ( F "{ access}{ _s}" )
ARRAY ( byte ) a= r.ResponseBody ; str s.fromn ( & a[0 ] a.len )
IXml x= JsonToXml ( s); ARRAY ( IXmlNode ) a1; x.Path ( "root/words_result/item/words" a1 1 )
int i; for ( i 0 a1.len ) out a1[i].Value
could be even less lines but there really is no point. Code could be all in 1 line if you really wanted but like i said what's the point.
Posts: 229
Threads: 22
Joined: Sep 2007
and here is my crack at making it shorter
Function
Function18
typelib WinHttp {662901FC-6951-4854-9EB2-D9A2570F2B2E} 5.1
WinHttp. WinHttpRequest r._create
r.Open ( "POST" "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=24.b305c9822131e65eda05e29c157dd719.2592000.1559103982.282335-16139329" )
r.setRequestHeader ( "content-type" , "application/x-www-form-urlencoded" ) ; r.SetRequestHeader ( "language_type" , "CHN_ENG" )
str sFile.getfile ( "$desktop$\3.png" ) ;; change to file location
str base64.encrypt ( 4 sFile "" 2 ) ; base64.escape ( 9 )
r.Send ( F "&image={ base64}" ) ; ARRAY ( byte ) by= r.ResponseBody
str json.fromn ( & by[0 ] by.len ) ; out json
Posts: 726
Threads: 99
Joined: Mar 2018
05-07-2019, 12:07 AM
(This post was last modified: 05-07-2019, 12:19 AM by win .)
Wow!
I think, is the code shorter and it runs faster?
Maybe what I think is wrong.
I think using external components may make the code run longer.
I am experiencing a problem with VBS code output
Wscript.Echo r.ResponseBody All are garbled
Wscript.Echo r.ResponseText Unicode characters are garbled
Set r = CreateObject("WinHttp.WinHttpRequest.5.1")
r.Open "POST", "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"
r.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
r.Send "access_token=24.b305c9822131e65eda05e29c157dd719.2592000.1559103982.282335-16139329&image=iVBORw0KGgoAAAANSUhEUgAAAScAAACCCAYAAAAE%2FA6oAAAK40lEQVR4nO3dQU%2FbyBvH8Ser%2F0uA8gbISmHpGwhiK3EjvVRVleve0ko9wGVvK7VIvXEJB7Qlt71G24rLhhtSi%2BAN0CXSJm%2BAwnvIf2bsUEjsxE4m8ePw%2FUhICBzbie1fZsYznkLPEABQ5qesdwAAohBOAFQinACoRDgBUIlwAqAS4QRAJcIJgEqEEwCVCCcAKhFOAFQinACoRDgBUIlwAqAS4QRAJcIJgEqEEwCVCCcAKhFOAFQinACoRDgBUIlwAqAS4QRAJcIJgEqEEwCVCCcAKhFOAFQinACoRDgBUIlwAqAS4QRAJcIJgEqEEwCVCCcAKhFOs3bblW7W%2BwDkkL9wuj2Qjb2CvG6nWX5DDm697UGoKwcfU%2ByHcfK5IIWPBzMKkX%2FkN%2FO5FNJ8NlM7kddz3R7gX6FneFubDZzDXbmQmrTeHcn2uOXbr6XQbJhfEi6fkA2byuUEL3zakt5LX3sR6n8ms1i3xu0Cnvit1i3tyB9P7S8NqXw%2BGb986Uha4fLH3r%2FlbeD1pDf2pyP1FbP4Sl06i3QR94%2FFZYUSFHLJe5vTdqmWfnkTDL%2BXYhZoH8yg6vc4BMeiLGvL45ftnh1Igq8TYG7%2B532NpjTUM1W0VMvHBFP3bEOKpxfmtyv5OXW1z5Te9hrJF19JtXKxbVvd21VZXUr7uni2Onpc6slRXFCn5Y5Fsu26avBpU%2Bpvz2XH43sCJuU%2FnIbYBuqi7F6nf2V5q2MurlVxDbwfD6T4ZkdWE786aTtWuH%2Bp964j%2B4dFSRx%2FpnpVSNIOdlmQb%2BZ9n28Ov9OJ29LGqFVN9fal%2Fc1%2BFhty8IqAggI9TW7qvfJ76cmn1lSraX0y63hf6yVbS6dX%2F9Ms%2F2fd%2FJZqK73a%2BwSvS%2FyewvVN%2BN5bn8q9%2Bs3YpZLtM6DATPo5uVvzSRrEB3TbTbGVuFopDw3TRVlLXRWcne3SujTbYzpDtI9dSa%2F8y%2FMUJVAgG1NX6360Cw0y1Ri5fxu7X72Lq26dyL5dz6jG8VRm3eakTOmFrO%2Fty8lmfFX2pO2iSaologn6TR1Oq5vn0tu8%2F5cwhJ4M9q9ZlZ03PdkJOwhW7K37e21I3bMP7lu99ixNu1KUrvz3vZyiYbdrLlpb8ni41e5tV1aX8nQRb8uLpxU5bptwigz3Ezm27VUrVXlOexJyIIPhK9tyZPsXvZKg57Sr%2FvksNdkQTNOguzoQTEEP8%2BJhcaKqaZZs14HGl%2Bie7v7CH5iPOdyti7G0I%2BfvnrtSVmHP%2FsGUdl6luXAmvwuYmL3D9v1hCU%2B10u9S%2F1KU%2FfbOQHeErvzzr2vNkxe%2BuikAM%2BZ3%2BIoTV62L9uD2%2BIqPILDVxg%2ByFlGtC9rH1j0NlbHbqSTvSpDUtMNN3JAgefAe%2B%2B2CtsuAtz5UwIxlV3KSH8HkLprlYCxYcW93uovI3ZEypYTDgjRj%2Bgt5NS5QE49x8xR2bkiQ%2BVw%2Fvwi35%2FtGAzAfGT0yJWjXqVwG499cELlqXkvsgItGc7KuCFZwRyoIvLTBZEsY9ukBiZ9QYAPHY5XvhesMOX2ZbvvXupRNlXTj7MR8zjbw0laZgezNv%2BTUfxKBu7AHL0TbWN4SsSWIidp7%2BnekRpUS4rsY3PVIt6UdE47nI4PC7OvLxDuWwHbMXbYJ2KCvXpnPuRL0G6vS4xv5M8eSU1BaKnxZk867USWEIKDc8OHrXdlPMaL%2B7o7Ukyspxpa84p9WcFfSshd3rp9QYD7rLz8CuNHO111HwPIYTkH%2FpcJeUa6edaT%2BvXJXNQuqS7%2BJvOolrAaZgHprqiYJR9T3t%2B%2FaVkyJ7OilHUx8bLY5i4fZKece4mfHCtaDL4FqLbjryMPnkDdTD4Dpjx2LGrN1VXN%2FL3%2Bd9UiuuPFx4Viy98G4s87Xcooxd554Gi%2BYRDCmUHq1q8H%2FhJ9PeJxmfzyA6U1dcureiKzboR9RjcPukR0dqf5bDBqa3c%2FriZ4bNGq83snncFjMUKks7PBZXZfdw0I4zKYhH84W66ne%2FYb8D8sdVz0dvtMZ9M7vhdXli9P7x4MSFXSaQT%2BnEe4ey5teXPcC1x1BkvYNmqzj5lRdG2b2uNwf76WcusvEqM8hzdAfYHbmG04%2BhRf9upeOhVF9jDxdpJ7CaXiAtb8QcQGfp57weBTyG04AFhrz1gFQiXACoBLhBEAlwgmASoQTAJUIJwAqEU4AVCKcAKhEOAFQiXACoBLhBEAlwgmASoQTAJUIJwAqLVQ4uadl5uy54Xnc58eGY5SNDMOpPyECBx6z4Wb72bv%2Fo%2FU841qI4jWc3MmQeDLM8PnebpYVwL%2Fguenhj%2BrzjGshSqbTkfu2%2FdLOh5f1XqSTx31%2BbDhG2VioNicAi4NwAqDS1NW6oVlBritSuIxYcKXu5rUbqT9Tyd0fxs8wYtu5Hk5xlHJWkqjpquy%2BPrsyfxdpvTsS3xOT53GfreH9lpHH1c3q4s6F4P09bw%2FOIJNs2q0f67l7VfAeH5wvNa%2FvO%2FNjNMG1sHB8ztDpZpVNO7OtmxG33Kt%2Frd3NzHsnnDF4eAbbMeu6Gb%2BoFcyQO7x8MDOwzGd24Fzsc3%2Fm5OF1x88yHLo%2FI%2FTg68fOCB1ud%2FCc6p8XX1N8dik%2F52leO%2FEx8nktLAAl1boL2T213yYD3wylI%2BlslaXRnGyW4NFO5PjSfnMPfxutbp5Lr1rzvsXpZbPPBx8r0rDz7kV827vGYrPdRnPMLXBbahh8fXh8L073I4%2Fv3XYH5%2FuzM0m%2Frcu30%2FslCy2mPUZZXAs6KQknW2SNLuaulqrmv9%2FkP%2B99P7ZlbUWk8eUg%2Bt9uKvXZVI8ml8E%2Bm%2BrJ7rU5Pr%2BOWKvZbuupuai%2Bxl025vWvoqt%2Bscd33HaXduSvLY033qc9RllcCzopCads2H4wnV%2BaAx31dHeEm%2Fc%2Bd2%2B%2FmVJPdWxbx3bJlAguj719qyfZ7urSuqet%2BZXH80qjhernNAlX1N4c%2BKNrjCxIc6sj55v6Juie5z53bkzF6frCXFi7CZYuu2%2F1bQ%2BNtm67Uh290PKaK0lolMfzSptHH06RTJXh%2FK2YE6kor5fG301SYUb7XFwuuxLM2Dutnrntfh%2Bz0M2VJIgwPfJ4XmXoUVfrRjInUtW2HbRz1Pw4g3127RzXzblXR1yVbcx2T9qN%2BH9qlcfzKiNew%2BnnJz7XNltupPnHmEbLYAm5ujYVleXi3PZpnEz22VxMf9jG7r9HbVeCfj0%2B21RKR1JfGdHIbqpIH6L602Usj%2BeVVl7DKWgUrcjGWffhP2xdW2OD4PWu2afoW7PuNvZKXV%2FbQAb7bLsLtJ7sxh4%2Fd0E2G1Le%2BstrJ8GdNy2pmfNpaDC5DcLDXVnfUjpQNo%2FnlUIF29nJ6xqHerYGhnsC28dEmAP1cKl7PWcn%2BX%2Bc4d7DrtextKRXOh7uyWuUZ9Jomcd9vifm2EpUX6Sxxy%2Bi53dMb%2FPRPcSbUh3qOT3N55zFMZr2WlhM%2FsMJmJfYcMIioEEc%2BRXercNiIpyQW0k7iCKfCCfkUvA0DIkdFoP8o80JysU0UCd5BA9yjXACoBLVOgAqEU4AVCKcAKhEOAFQiXACoBLhBEAlwgmASoQTAJUIJwAqEU4AVCKcAKhEOAFQiXACoBLhBEAlwgmASoQTAJUIJwAqEU4AVCKcAKhEOAFQiXACoBLhBEAlwgmASoQTAJUIJwAqEU4AVCKcAKhEOAFQiXACoBLhBEAlwgmASoQTAJUIJwAqEU4AVCKcAKj0f0KuyhM4KAWmAAAAAElFTkSuQmCC&language_type=CHN_ENG&probability=true&detect_direction=true"
Wscript.Echo r.ResponseBody
'Wscript.Echo r.ResponseText
Posts: 1,337
Threads: 61
Joined: Jul 2006
The code itself is fast enough. What varies is the server response time. Which you have no control of. Code for me takes maybe 1 second or less to get a response.
Posts: 229
Threads: 22
Joined: Sep 2007
this so far has no error protection so when it errors it fails. the idea is to make it robust and catch potential errors
something like this
Function
Function18
typelib WinHttp {662901FC-6951-4854-9EB2-D9A2570F2B2E} 5.1
WinHttp. WinHttpRequest r._create
r.Open ( "POST" "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=24.b305c9822131e65eda05e29c157dd719.2592000.1559103982.282335-16139329" )
r.setRequestHeader ( "content-type" , "application/x-www-form-urlencoded" ) ; r.SetRequestHeader ( "language_type" , "CHN_ENG" )
str sFile.getfile ( "$desktop$\100jhkjghjkg0.png" ) ;; change to file location
err goto endof
str base64.encrypt ( 4 sFile "" 2 ) ; base64.escape ( 9 )
r.Send ( F "&image={ base64}" )
err goto endof
ARRAY ( byte ) by= r.ResponseBody
out r.Status
sel r.Status
, case 200 ;;The request completed successfully.
, str json.fromn ( & by[0 ] by.len ) ; out json
, case 404 ;;The server has not found anything that matches the requested URI.
, out "error"
, case else out "Fail"
ret
;endof
out _error.description
ret
Posts: 726
Threads: 99
Joined: Mar 2018
Posts: 1,337
Threads: 61
Joined: Jul 2006
one tip use a jpg instead of a png the documentation recommends jpg over other types
Posts: 726
Threads: 99
Joined: Mar 2018
05-07-2019, 01:11 AM
(This post was last modified: 05-07-2019, 01:12 AM by win .)
I think the best is PNG, because JPG is sometimes very blurry, affecting the recognition effect, I sent a code (screenshot + text recognition)
http://www.quickmacros.com/forum/showthr...4#pid33604
Posts: 1,337
Threads: 61
Joined: Jul 2006
from the api documentation
Posts: 726
Threads: 99
Joined: Mar 2018
05-07-2019, 03:00 AM
(This post was last modified: 05-07-2019, 03:10 AM by win .)
JPG ? Why not PNG? For text, I think GIF is the best, small, and very clear.
This is currently the most popular free OCR software in China, it integrates many OCR engines, it is open source
There are many useful features, such as translation, barcode recognition, etc.
https://github.com/AnyListen/tianruoocr
Posts: 726
Threads: 99
Joined: Mar 2018
@kevin
In VBS, using the following com object, the output will not be garbled, but I did not find it in QM's class library.
Set r = CreateObject("MSXML2.ServerXMLHTTP ")
Wscript.Echo r.ResponseText
Posts: 726
Threads: 99
Joined: Mar 2018
How does QM create an MSXML2.ServerXMLHTTP object?
Posts: 229
Threads: 22
Joined: Sep 2007
05-08-2019, 12:45 AM
(This post was last modified: 05-08-2019, 12:49 AM by redbull2k .)
you can find a lot of useful info in tools> com libraries
Function
Function21
typelib MSXML2 {F5078F18-C551-11D3-89B9-0000F81FE221} 3.0
MSXML2. ServerXMLHTTP b._create
Posts: 726
Threads: 99
Joined: Mar 2018
Thank you for your help, what method did you find for it?
Posts: 229
Threads: 22
Joined: Sep 2007
i Just found it for you. All typelib can be found in Tools>Com Libraries, once your there just find microsoft xml find the newest version which will be v6.0. double click it to isert it in current function/macro there are also controls that you can attach to dialog.
Posts: 726
Threads: 99
Joined: Mar 2018
05-08-2019, 01:01 AM
(This post was last modified: 05-08-2019, 01:14 AM by win .)
This is my new code, it is better understood
Macro
Macro8
typelib MSXML2 {F5078F18-C551-11D3-89B9-0000F81FE221} 3.0
MSXML2. ServerXMLHTTP r._create
r.Open ( "POST" F "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic" )
r.setRequestHeader ( "content-type" , "application/x-www-form-urlencoded" )
r.SetRequestHeader ( "cache-control" , "no-cache" )
str access= "access_token=24.b305c9822131e65eda05e29c157dd719.2592000.1559103982.282335-16139329&image="
str sFile.getfile ( "$desktop$\1.png" ) ;; change to file location
_s.encrypt ( 4 sFile "" 2 )
_s.escape ( 9 )
r.Send ( F "{ access}{ _s}" )
IXml x= JsonToXml ( r.ResponseText )
ARRAY ( IXmlNode ) a
x.Path ( "root/words_result/item/words" a 1 )
str d
for ( int ' i 0 a.len )
, d.addline ( a[i].Value )
mes d.trim
Thank you for your help, I just learned that it is an xml component.
@Kevin
I feel using the current components(MSXML2.ServerXMLHTTP), the response is faster
Attached Files
Image(s)
Posts: 229
Threads: 22
Joined: Sep 2007
test for yourself
Function
Function21
long t1= perf
typelib MSXML2 {F5078F18-C551-11D3-89B9-0000F81FE221} 3.0
MSXML2. ServerXMLHTTP r._create
r.Open ( "POST" F "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic" )
r.setRequestHeader ( "content-type" , "application/x-www-form-urlencoded" )
r.SetRequestHeader ( "cache-control" , "no-cache" )
str access= "access_token=24.b305c9822131e65eda05e29c157dd719.2592000.1559103982.282335-16139329&image="
str sFile.getfile ( "$desktop$\2.png" ) ;; change to file location
_s.encrypt ( 4 sFile "" 2 )
_s.escape ( 9 )
r.Send ( F "{ access}{ _s}" )
long t2= perf ;;get time after
out t2- t1 ;;display the difference
IXml x= JsonToXml ( r.ResponseText )
ARRAY ( IXmlNode ) a
x.Path ( "root/words_result/item/words" a 1 )
str d
for ( int ' i 0 a.len )
, d.addline ( a[i].Value )
mes d.trim
Posts: 726
Threads: 99
Joined: Mar 2018
05-08-2019, 01:42 AM
(This post was last modified: 05-08-2019, 01:47 AM by win .)
127648
Can this value measure the response speed?
In my case, OCR recognition is too fast, there is almost no delay, it may be my reason in China, closer to Baidu's server.
Posts: 229
Threads: 22
Joined: Sep 2007
that value is in milliseconds its just like a stopwatch,we tell it to start we tell it to end. its just telling you the result from start to finish.
response times kevin has already told you, it all depends on server location as well as many other factors. the only way i think you can improve is by having the server in your kitchen or something.
Posts: 726
Threads: 99
Joined: Mar 2018
indeed so
Posts: 726
Threads: 99
Joined: Mar 2018
It can also be implemented using powershell code, see the link below
http://www.quickmacros.com/forum/showthr...1#pid33661