百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)
标签: 百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error) 博客 51CTO博客
2023-05-17 18:24:09 319浏览
前言:
百度智能云的图像内容审核真的坑死我了!!!弄了我整整2个小时。我只想吐槽一句: baidu 我 ?? 你个大??!操作很简单,就是把图像转成 Base64 然后上传给百度智慧云后台服务处理,并返回审核结果。然而里面的细节真是把我整吐了,下面由我娓娓道来。
坑点①:
API Explorer 在线调用器没有明确说明 base64 的格式
我按照上述描述编写请求参数:data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD...,结果就出现了如下错误提示信息:image format error (图像格式化错误)

解决: 后来在另一参数说明文档看到请求参数的明确格式要求:

当我以为这样就完了,应该没问题了,结果还是 image format error (图像格式化错误) ????==> 到达坑点 ②
坑点②:
我先随便找了一张图,使用在线图像编码转换站点进行base64编码,然后去掉图像头 data:image/jpg;base64, 放入 postman 中去请求测试,返回结果为合规,说明图像审核通过。

我再次尝试在我的项目程序中上传,断点调试对比了一下,base64 没有问题呀,为什么还是返回 image format error (图像格式化错误) 呢?


把这里面 base64 编码复制到 postman 也依旧是返回 image format error (图像格式化错误)。

但是我们可以发现 value 值中似乎多了很多 \r\n 回车换行。

我尝试把 \r\n 全部替换成 “”,把程序生成的base64编码再次放入 postman 中进行请求,响应结果为合规,审核通过。百度OCR服务器后台程序竟然不把 \r\n 去掉,这种低级错误,真的无语…。
我知道为啥百度不会过滤剔除 \r\n,查看示例发现百度提供了一个 Base64Util 工具包,公司程序员写了个base64编码的工具类 https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 ,我使用的是 Java 自带的
BASE64Encoder类进行 base64 编码,会生成 \r\n 。 而百度提供的工具类不会生成 \r\n 。(建议还是用百度提供的吧,如果还是使用BASE64Encoder,可以replaceAll("\r\n", "")进行替换。
我又以为这样就完事儿了,这下程序总能运行成功了吧。结果 wdnmd !发送请求还是返回错误信息 image format error (图像格式化错误),真的裂开 ==> 到达坑点 ③

坑点③:
上述两个坑踩完以后,我的程序生成的 base64 和 postman 的请求参数值已经是完全一样的,那为什么postman发送请求能成功审核,我的程序还是跑不起来了呢?

我再次仔细研读开发文档,发现请求体需要进行 urlencode 格式化。但是我就有一个疑问了?postman 没有进行 urlencode 为什么能响应返回成功?难道 postman 自动会对请求参数进行 url 编码?

没想这么多,先给我程序加上试试, 结果就成功了,问题解决。


总结:
1、图像的base64编码是不包含图像头的,不要携带如:(data:image/jpg;base64,)的图像头
2、尽量使用官方提供的 Base64 编码工具包:https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 , 如果使用 java 自带的 BASE64Encoder, 记得把 \r\n 去掉, replaceAll("\r\n", "") 进行替换。
3、别忘了对请求体进行 url 编码 URLEncoder.encode()
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论
您可能感兴趣的博客



