本篇,我们就来看看如何使用Python将QQ好友头像拼成“五一快乐”四个字。我们可以将整个实现过程分为两步:爬取QQ好友头像,利用好友头像生成文字。爬取头像要爬取QQ好友的头像,我们需要用到QQ邮箱。首先我们从浏览器登录QQ邮箱,然后按F12键打开开发者工具,鼠标选择网络选项,如下图:然后我们按F5键刷新网页,然后在Filter中输入laddr_lastlist,如下图:我们再次点击Name下的链接,点击后右侧会出现一个窗口,我们用鼠标选中Response项,如下图:我们终于把Response下出现的内容复制到一个txt文件中。获取到爬取需要的东西后,我们就可以开始爬取了。我们使用requests库爬取头像图片保存到本地。代码实现如下:#获取头像defget_head():file=codecs.open('qqfriends.txt','rb','utf-8')s=file.read()pattern=re.compile(r'\d+@qq.com')#regex匹配所有qq号all_mail=pattern.findall(s)#用来存放需要访问的链接all_link=[]url='http://qlogo.store.qq.com/qzone/'用于all_mail中的邮件:qq=mail.replace('@qq.com','')l=url+qq+'/'+qq+'/100'all_link.append(l)#初始化下载图片数量i=0#获取好友头像数量friends_count=len(all_link)print('共有{}个头像'.format(friends_count))#遍历链接,为链接下载头像inall_link:i+=1saveurl='head/'+str(i)+'.png'print('%dth'%i,end='')sava2img(link,saveurl)returnTrue#函数存储图片,picurl为图片的URL,saveurl为本地存储位置defsava2img(picurl,saveurl):try:start=time.time()response=requests.get(picurl,stream=True)#下载图片到本地用open(saveurl,'wb')asfile:file.write(response.content)print('下载完成...',end='')end=time.time()time_=end-startprint('耗时:%.2f秒'%(time_))returnTrueexcept:print('Anerroroccurred...')生成文字有了QQ头像图片,我们就来看看如何使用这些图片生成文字。这里我们需要用到第三方库PIL,安装使用pipInstallPillow,我们需要先把“五一快乐”四个字转换成汉字库的点阵数据再使用。下面来看具体实现:#将单词转换成汉字库的点阵数据defchar2bit(textStr):KEYS=[0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01]target=[]全局计数count=0forxinrange(len(textStr)):text=textStr[x]rect_list=[]*16foriinrange(16):rect_list.append([]*16)gb2312=text.encode('gb2312')hex_str=binascii.b2a_hex(gb2312)结果=str(hex_str,encoding='utf-8')area=eval('0x'+result[:2])-0xA0index=eval('0x'+result[2:])-0xA0offset=(94*(area-1)+(index-1))*32font_rect=Nonewithopen("HZK16","rb")作为f:f.seek(offset)font_rect=f.read(32)forkinrange(len(font_rect)//2):row_list=rect_list[k]forjinrange(2):foriinrange(8):asc=font_rect[k*2+j]flag=asc&KEYS[i]row_list.append(flag)output=[]forrowinrect_list:foriinrow:ifi:output.append('1')count+=1else:output.append('0')target.append(''.join(output))returntarget#生成图像文本defhead2char(workspace,folder,self,outlist):#将工作路径转移到头像文件夹os.chdir(folder)#获取文件夹中的头像列表imgList=os.listdir(folder)#获取头像图片的数量numImages=len(imgList)#设置裁剪后头像的大小eachSize=100#变量n用于循环遍历头像图片n=0#变量count用于对最终生成的单词图片进行编号count=0#初始化颜色列表用于背景着色colorlist=['#FFFACD','#F0FFFF','#BFEFFF','#b7facd','#ffe7cc','#fbccff','#d1ffb8','#febec0','#E0EEE0']#index用于改变不同单词的背景颜色index=0#每个itemiteminoutlist对应不同字符的点阵信息:#将工作路径改为头像所在文件夹os.chdir(folder)#新建一个背景色画布,16*16点阵,每个点填充2*2头像图片,所以长度为16*2*100canvas=Image.new('RGB',(3200,3200),colorlist[index])#新建canvas#索引变换,用于改变背景colorindex=(index+1)%9count+=1#16*16点阵中的每个点填充四张100*100头像foriinrange(16*16):#点阵信息为1,即表示头像要显示在这里形成单词ifitem[i]=="1":#循环读取连续四张头像图片x1=n%len(imgList)x2=(n+1)%len(imgList)x3=(n+2)%len(imgList)x4=(n+3)%len(imgList)#下面四组try,将读取的四个头像填入画板上对应的点#左上角LatticeImage1/4try:#打开图片img=Image.open(imgList[x1])除了IOError:print("一张图片读取失败,已被替换图片")img=Image.open(self)finally:#缩小图片img=img.resize((eachSize,eachSize),Image.ANTIALIAS)#stitchimagescanvas.paste(img,((i%16)*2*eachSize,(i//16)*2*eachSize))#图像右上角2/4的点阵try:img=Image.open(imgList[x2])exceptIOError:print("无法读取1张图像,它已被备用图像替换")img=Image.open(self)最后:img=img.resize((eachSize,eachSize),Image.ANTIALIAS)canvas.p??aste(img,(((i%16)*2+1)*eachSize,(i//16)*2*eachSize))#左下角的图像3/4点阵的尝试:img=Image.open(imgList[x3])exceptIOError:print("Failedtoread1image,ithasbeenreplacedbyanalternateimage")img=Image.open(self)最后:img=img.resize((eachSize,eachSize),Image.ANTIALIAS)canvas.paste(img,((i%16)*2*eachSize,((i//16)*2+1)*eachSize))#Image4/4点阵右下角try:img=Image.open(imgList[x4])exceptIOError:print("一张图片读取失败,已被替代图片替换")img=Image.open(self)最后:img=img.resize((eachSize,eachSize),Image.ANTIALIAS)canvas.paste(img,(((i%16)*2+1)*eachSize,((i//16)*2+1)*eachSize))#调整n读取后续图片n=(n+4)%len(imgList)os.chdir(workspace)#创建一个存放输出结果的文件夹ifnotos.path.exists('output'):os.mkdir('output')os.chdir('output')#存储拼接好的图片,quality为图片质量,1-100,100为最高canvas.save('result%d.jpg'%count,quality=100)看一下实现效果:源码可以在公众号后台回复20个Python小二0501获取
