百度ai通用文字识别,出现image format error的问题
escape() 常用于对js字符串进行编码
encodeURI() 常用于对URI跳转进行编码
encodeURIComponent() 常用于对参数传递时进行编码(有可能特殊字符,/,=等造成URI的间断问题)
解决办法
在使用百度ai进行通用文字识别时,发送image=<base64编码>
这种格式时,请求api可能会返回image format error
的问题,很有可能是编码问题导致的,需要使用encodeURIComponent()
这个方法来格式化一下即可,即image=encodeURIComponent(<base64编码>)
举例:从html中截取img标签中的内容进行识别
此例子有跨域问题,需要自行使用后台做一次转发,这里简洁为主,就暂时不考虑了。
简洁为主,只列出了img标签
<img id="my-img" />
将img标记的内容转换为base64
// 获取验证码
function getCode64 () {
// 寻找该元素
const img = document.querySelector('#my-img')
//创建canvas画布
const canvas = document.createElement('canvas')
canvas.width = img.width
canvas.height = img.height
// 画图
const ctx = canvas.getContext('2d')
ctx.drawImage(img, 0, 0, img.width, img.height)
// 转换,有前缀,百度api要求去掉前缀
const dataURL = canvas.toDataURL('image/png')
// 返回
return dataURL.replace('data:image/png;base64,', '')
}
进行请求
采用了原生的XMLHttpRequest,当然也可以使用fetch
实际是有跨域问题,这里暂时不考虑
// 百度通用文字识别api地址,记得加access_token
const GeneralURL = 'xxxxx'
// 查询验证码
function fetchNum(base64) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest()
xhr.open('POST', GeneralURL, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
// 此时要进行编码
xhr.send(`image=${encodeURIComponent(base64)}`)
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200 ) {
const result = JSON.parse(xhr.responseText)
try {
const code = result.words_result[0].words
resolve(code)
} catch (err) {
reject(err)
}
}
}
})
}
使用
let base64 = getCode64()
fetchNum(base64).then(res => {
// res为处理结果
})