上一章我们说到如何使用URL的方式传递图像信息,相信你与我一样都认为这种方式太简单了
的确有点太简单了,然而,要清楚,我们大多所需要的是能检测保存于你电脑硬盘中的照片,我们不可能将它们一个个上传至服务器,再用它们的URL去做人脸检测,毕竟这样过于吃力不讨好。所以今天的目的就是教会你们如何上传本地的图片。
知道了目标,我们来看看如何实行
自然image_type参数中需要填入“BASE64”,那么image参数中又该传递什么值呢?
图片类型 BASE64:图片的base64值,base64编码后的图片数据,需urlencode,编码后的图片大小不超过2M
那么什么是BASE64?在技术文档的常见问题板块中百度做出了解释
摘录如下
Q:什么是base64编码,如何提供?
A:图片的base64编码指将一副图片数据编码成一串字符串,使用该字符串代替图像地址。您可以首先得到图片的二进制,然后用Base64格式编码即可。注:图片的base64编码是不包含图片头的,如(data:image/jpg;base64,)
百度的技术人员已经很热心的将你该怎么做“详细地”写出来了,也就是我们先要得到图片的二进制
首先在你保存源码的文件夹里放置一张图片,我们依旧使用上一章所使用的图片
当然,这个图像文件你可以放在任何位置,为了方便我直接就与源码放在一起,这样就无需指定路径了。
这样我们就可以开始将图像BASE64化了
import base64
filePath ="eee.jpg"
with open(filePath,"rb") as f:
# b64encode是编码
base64_data = base64.b64encode(f.read())
现将你的图像路径赋给filePath变量,这样修改起来十分方便。在这里,我先前将图像文件与源码放在一起的优势就展现出来了,因为我可以直接用“文件名+后缀名”来代替那一长撂的路径,毕竟在一个文件夹,就是一家人啊,肥水不流外人田。
在python中,我们可以使用open()这个函数来打开文件并返回文件变量。
open()的语法是这样的
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True)
我们可以看到open函数有很多的参数,我们要用的也只会是file,mode和encoding这三个参数,其他参数看看就好了
file代表的自然就是文件路径,如”C:\\I Love AI.jpg”等等,
mode是指明打开文件的模式。默认值是’r’,表示使用文本的方式打开文件来读取。 python中文件有以下几种打开模式
mode | 执行操作 |
---|---|
‘r’ | 以只读方式打开文件(默认) |
‘w’ | 以写入的方式打开文件,会覆盖已存在的文件 |
‘a’ | 以写入模式打开,如果文件存在,则在末未追加写入 |
‘x’ | 如果文件已存在,使用此模式会引起异常 |
‘b’ | 以二进制模式打开文件 |
‘t’ | 以文本模式打开文件(默认) |
‘+’ | 可读写模式(可添加到其他模式中使用) |
‘U’ | 通用换行符支持 |
以上表格来源于由小甲鱼 编著 由 清华大学出版社 出版的《零基础入门学习 Python》 小甲鱼工作室网站https://ilovefishc.com/ 里面有很多教程,着力推荐一下
可以看到若我们想用二进制打开图像文件,只需将’b’传递给mode参数,就好了
当然,如果你这么写
open(filePath,"b")
那你只会收到一个大大的错误提示,
从提示中我们可以看出我们必须有个“写入”、“只读”这样的模式加上去
所以我们在”b”模式上叠加个只读模式”r”,也就这么写了
open(filePath,"rb")
这样我们使用open()成功打开了一个文件之后,它就会返回个文件对象,有了这个文件对象,我们就可以读取或修改这个文件。
文件对象操作的方法就不在这里说了,大家可以去看看有关python文件操作的资料
回到正题,需要注意的是open了文件,在最后需要close文件,当然python会自动关闭文件,但是良好的代码习惯是一劳永逸的,所以一定记住close()来关闭文件
这是也许你会产生疑问了,我看你上面的代码也没close()啊,啧啧,你叫别人养成良好代码习惯,自己呢?
听到你这句话,我就只能一笑而过了。在你发现我代码中没写close()的时候,你也一定会发现代码中有些别样的东西,对那就是 With 语句
with open(filePath,"rb") as f:
很多开发者都会觉得又要打开文件,又要关闭文件的很麻烦,这样重复的事能不能简化下啊
python关注到了广大开发者的心声,于是在python v2.5+版本中加入了 with 语句
使用了with语句,可以大大减少代码量,你也无需担心忘记关闭文件了,因为with语句会帮你自动关闭。
回到代码,很明显我们将eee.jpg这个文件赋予给了f,于是我们可以对f这个文件对象进行一系列的操作
为了将二进制文件转化成BASE64格式,我们不得不引入一个模块,那就是“base64”模块,这通俗易懂
在此模块中我们可以将二进制格式转化为BASE64格式
import base64
base64_data = base64.b64encode(f.read())
f.read()函数就是读取出了f这个文件对象中所蕴含的数据,然后使用base64.b64encode()函数进行编码,则完成了BASE64化
完成了BASE64化,如果直接post的话,因为图像数据的格式是URL不能接受的,所以我们又要转化下字符串的文字编码
image = str(base64_data,'utf-8')
这样的话,我们就能成功的把图像数据上传至百度服务器了
看看效果
和使用URL获取的一样的数据,同样的,需要什么数据取出就好了
贴出源码
from aip import AipFace
import base64
""" 你的 APPID AK SK """
APP_ID = 'XXXXXX'
API_KEY = 'XXXXXXXXXXXXXXXX'
SECRET_KEY = 'XXXXXXXXXXXXXXXXXXX'
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
filePath ="eee.jpg"
with open(filePath,"rb") as f:
# b64encode是编码
base64_data = base64.b64encode(f.read())
image = str(base64_data,'utf-8')
imageType = "BASE64"
#参数设置
options = {}
options["face_field"] = "age,beauty"
options["max_face_num"] = 1
options["face_type"] = "LIVE"
""" 调用人脸检测 """
result = client.detect(image, imageType,options);
print(result)