动态照片墙 python 实现_用Python玩转微信 (三): 微信好友照片墙的制作

大家好,好久不见。由于个人的一些原因,已经好久没有更新公众号了,在这里给大家道个歉。顺便说一声,我太想你们了!

5f4bcdbc-4d98-4002-bf31-e041abe528b4.jpg

好了,寒暄过后,废话不多说,赶紧上干货!今天继续简介itchat模块控制微信的一些小的demo。我们今天要介绍的是如何利用itchat结合pillow库(使用方法详见用Python中的pillow库,做图像处理)来制作微信好友的照片墙!

22b543f9-d0ed-4868-95d3-62194ec165d4.jpg

前面两讲中,我们初步认识了itchat库,简介了itchat的一些重要使用方法,其中的一些如下表所示。

方法名

作用

auto_login

实现网页版微信的登录,登录前需要扫二维码

get_friends

获得微信所有好友的信息,返回一个包含信息的列表

search_friends

搜索满足一定条件的好友信息

send

用程序向指定用户发信息

以上函数中,其中的get_friends函数非常重要,它可以以列表的形式返回您所有微信好友的信息,列表中的每一个元素为一个字典,里面存储了对应好友的信息。字典中有许多的键共有32个,主要包括:

UserName City DisplayName PYQuanPin RemarkPYInitial Province KeyWord RemarkName PYInitial EncryChatRoomId Alias Signature NickName RemarkPYQuanPin HeadImgUrl UniFriend Sex AppAccountFlag VerifyFlag ChatRoomId HideInputBarFlag AttrStatus SnsFlag MemberCount OwnerUin ContactFlag Uin StarFriend Statues MemberList WebWxPluginSwitch HeadImgFlag

前面讲了, 以上的所有键值中 UserName非常重要,该键值是网页版微信中每个用户的用户名(或叫做用户编号),它是一个由字母与数字随机生成的65位编码,一个UserName对应一个微信用户,UserName是不会重复的。需要注意的,每一次登录,该编码是随机产生的。通过利UserName键我们可以利用search_friends精准的筛选出我们要找的某个好友,或者给某个好友发信息,同时,亦可以通过该键获得好友的其他信息,比如,好友所使用的照片。要获得好友的照片,我们需要用到get_head_img函数,使用格式为:

get_head_img(userName)

例如:

img=get_head_img(userName='@d7f341a31d11adcfde8266c179c9e506aa5fe069f954490f8583abe6b00ddca1')

可以获得userName的编号为"

@d7f341a31d1

1adcfde8266c

17

9c9e

506aa5fe069f954490f8583abe6b00ddca1"好友的照片。需要注意的是返回的照片数据为字节串(bytes),即为原始的二进制数据格式。为了保存该图片,我们需要将它写到文件里。代码如下:

img_path='myfriend.jpg'

withopen(img_path,'wb') asfile:

file.write(img)

这样就可以吧图片数据"img"写到"myfriend.jpg"文件中,从而得到了好友的图片。

好了,铺垫已完成,接下来介绍我们的一个小demo----制作微信好友的照片墙。

93971d78-cfb3-45df-a0e9-031d6dba38c1.jpg

(出于个人隐私原谅我打了马赛克

2_05.png

制作微信好友照片墙的算法大致如下:

c137aa38-0964-4809-a138-b935b59f4a55.png

(1).首先登录网页版微信,代码如下:

itchat.auto_login(hotReload=True)

friends=itchat.get_friends(update=True)

(2).

加载所有好友信息并将他们的照片保存起来。代码如下:

num=0forfriend infriends[:]:

try:

img=itchat.get_head_img(userName=

friend['UserName'])

img_path=os.path.join(os.getcwd()+'\pic',

str(num)+'.jpg')withopen(img_path,'wb') asfile:

file.write(img)

num += 1except:

print('第'+str(num)+'个朋友的图片读取有误!')

(3)

.利用pillow库将好友的照片制作成照片墙

。代码如下:

# 设置画布的大小

img_size=1080# 设置每个头像大小

each_size=math.ceil(

img_size/math.floor(math.sqrt(num)))# 计算所需各行列的头像数量x_lines=math.ceil(math.sqrt(num))

y_lines=math.ceil(math.sqrt(num))

friend_image=Image.new('RGB',(each_size*x_lines

,each_size*y_lines))x=0y=0fori inrange(num):

try:

img=Image.open(os.getcwd()+"\\pic\\"+str(i)

+'.jpg')except:

print('第'+ str(i) + '个朋友的图片读取有误!')

continue

img=img.resize((each_size,each_size),

Image.ANTIALIAS)

friend_image.paste(img,(x*each_size,

y*each_size))x+=1ifx==x_lines:

x=0y+=1

friend_image.save(os.getcwd()+"\\pic\\"+

'myfriends.jpg')

以上代码中的难点在于如何确定每个照片的大小与尺寸,然后再将照片按顺序扑倒画布上。同时还要注意对照片读取过程中的异常做处理。

(3).

利用opencv库制作图片的马赛克。代码如下

globalframe

defdo_mosaic(x,y,w,h,neighbor=2):

globalframe

fh = frame.shape[0]

fw = frame.shape[1]

if(y + h > fh) or(x + w > fw):

returnfori inrange(0,h - neighbor,neighbor):forj inrange(0,w - neighbor,neighbor):

rect = [j + x,i + y,neighbor,neighbor]

color = frame[y + i][x + j].tolist() left_up = (rect[0],rect[1])

right_down = (rect[0] + neighbor - 1,

rect[1] + neighbor - 1)cv2.rectangle(frame,left_up,right_down,color,-1)

frame=cv2.imread(os.getcwd()+"\\pic\\"+

'myfriends.jpg')height=frame.shape[0]

width = frame.shape[1]

do_mosaic(0,0,width,height,10)

cv2.imwrite('picture_wall.jpg',frame)

最终,获得好友图片墙照片如下:

93971d78-cfb3-45df-a0e9-031d6dba38c1.jpg

-end-

扫码关注公众号

d6d8b422-2570-462b-8f6f-27cc944e1d78.jpg

推荐阅读

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值