python实现骚操作,表白神技:整个朋友圈都是爱你的样子

你还在担心找不到女孩吗?

[En]

Are you still worried that you can’t get a girl?

是你不够帅吗?
还是不够幽默?
不,因为你没有注意到我!

[En]

No, because you didn’t pay attention to me!

注意学了一波又一波的撒娇操作,学过接送女孩后,女孩们都在排队去火车站。

[En]

Pay attention to learn a wave of coquettish operation, after learning to pick up girls, girls are lined up to the railway station.

今天,我要和大家分享的是,第一个操作就是教你如何使用微信好友的头像拼出你想要的单词。

[En]

Today, I’m going to share with you that the first-hand operation is to teach you how to use the avatars of your Wechat friends to spell out the words you want.

我给这个项目起了个好听的名字:“整个朋友圈都爱你!”

[En]

I gave this project a nice name: “the whole circle of friends loves you!”

不多bb,我们先看一下效果图。

当然,我们的效果图不会像下图所说的那样。

[En]

Of course, our effect picture will not be like what the following picture says.

python实现骚操作,表白神技:整个朋友圈都是爱你的样子

当然,值得一提的是,这里有想法和代码,还有很大的发展空间,让项目更具吸引力。

[En]

Of course, it is worth mentioning that there are ideas and code here, and there is a lot of room for development to make the project more attractive.

效果图

python实现骚操作,表白神技:整个朋友圈都是爱你的样子

bb两句上面的到底是啥东西。

上面的三个大字”爱你哦”,是用我的500好友的头拼接而成的,是不是很血腥!
不,是我朋友圈的所有好友的头像,拼接而成的,这不就是”整个朋友圈都是爱你的样子!”

这13装的,我给你满分,多一分都不行。

OK,客套话结束了,接下来就是展示真功夫的时候。

直接上项目:https://github.com/pengfexue2/pic2char

简单介绍一下,项目的主要内容:

[En]

A little introduction, the main content of the project:

python实现骚操作,表白神技:整个朋友圈都是爱你的样子

代码说明: wx2char.py用来扫码登录微信,获取微信好友头像存储到本地,将头像图片拼接成inpt = “二零一九新年快乐!”中的文本内容。 1.需要先安装PIL和itchat库 2.运行代码时需要扫码登录微信网页版 3.目前点阵库是依靠汉字库实现的,即文件夹中的HZK16文件,输入文本时要求是汉字和中文标点,否则可能导致报错 4.若出现”有1位朋友的头像读取失败,已使用本人头像替代”字样,是正常现象,因为有的微信好友头像格式问题获取不到
pic2char.py是假设你想用别的图片来组成文字图片,无需获取微信头像,直接输入汉字用图片来拼接展示 1.需要PIL库 2.需要HZK16文件来获取汉字点阵信息 3.运行代码前,要将图片文件夹放到代码文件夹中,将代码中的user=”TED”改为文件夹名称,同时准备一张备用图片将路径赋值给self用作读取图片失败时备选替代
使用说明: 拿到代码后,可以选择修改wx2char.py中要输出的文本内容,保存后直接运行,会跳出二维码图片,扫码登录微信网页版,生成微信好友头像的文件夹(例如:TED文件夹),本人的微信头像(TED.jpg),和最终结果图片的文件夹(TED_output)
因为如果好友数目太多会导致读取微信头像耗时较长,所以准备了pic2char.py用来玩把图片转成汉字的功能,提前准备好图片文件夹和一张备用图片,在代码中对应修改好即可运行

握草。这么能BB的吗?
Talk is cheap. Show me the code

那么我们 直接开始实战操作的讲解吧

(1)wx2char.py用来扫码登录微信,获取微信好友头像存储到本地,将头像图片拼接成inpt = “爱你哦!”中的文本内容。

import binasciiimport osfrom PIL import Imageimport itchatdef char2bit(textStr):    KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]    target = []    global count    count = 0    for x in range(len(textStr)):        text = textStr[x]        rect_list = [] * 16        for i in range(16):            rect_list.append([] * 16)        gb2312 = text.encode('gb2312')        hex_str = binascii.b2a_hex(gb2312)        result = str(hex_str, encoding='utf-8')        area = eval('0x' + result[:2]) - 0xA0        index = eval('0x' + result[2:]) - 0xA0        offset = (94 * (area-1) + (index-1)) * 32        font_rect = None        with open("HZK16", "rb") as f:            f.seek(offset)            font_rect = f.read(32)        for k in range(len(font_rect) // 2):            row_list = rect_list[k]            for j in range(2):                for i in range(8):                    asc = font_rect[k * 2 + j]                    flag = asc & KEYS[i]                    row_list.append(flag)        output = []        for row in rect_list:            for i in row:                if i:                    output.append('1')                    count+=1                    #print('0', end=' ')                else:                    output.append('0')                    #print('.', end=' ')            #print()        target.append(''.join(output))    return targetdef getHeadImgs():    #通过二维码登录微信网页版    itchat.auto_login()    #获取微信好友信息列表    friendList = itchat.get_friends(update=True)    #这里会用到的微信好友信息如下: User= {'UserName': '@8238e922e8be7356b1750c306cb75768','PYQuanPin': 'TED','NickName': 'TED'}    #获取用户个人昵称,用于之后文件夹命名、用户头像命名    if friendList[0]['PYQuanPin']:        user = friendList[0]['PYQuanPin']    else:        user = friendList[0]['NickName']    #先读取用户本人头像,存储名为用户名称    selfHead = "{}/{}.jpg".format(os.getcwd(),user)    with open(selfHead,'wb') as f:        head = itchat.get_head_img(friendList[0]['UserName'])        f.write(head)    #创建文件夹用于存储好友头像    if not os.path.exists(user):        os.mkdir(user)    #工作路径转到新建文件夹中    os.chdir(user)    #获取新建文件夹路径    userspace = os.getcwd()    #开始读取好友头像写入新建文件夹中    print("开始读取%d位好友头像..."%(len(friendList)-1))    for i in range(1,len(friendList)):        if i % 100 ==0:            print("已读取%d位好友头像,请耐心等待~"%i)        try:            friendList[i]['head_img'] = itchat.get_head_img(userName=friendList[i]['UserName'])            friendList[i]['head_img_name'] = "%s.jpg" % friendList[i]['UserName']        except ConnectionError:            print('Fail to get %s' % friendList[i]['UserName'])        with open(friendList[i]['head_img_name'],'wb') as f:            f.write(friendList[i]['head_img'])    print("读取好友头像完毕!")    #保存头像的文件夹路径和用户本人头像路径返回    return user, selfHeaddef head2char(workspace,user,self,outlist):    folder = "{}\\{}".format(workspace,user)    #将工作路径转移至头像文件夹    os.chdir(folder)    #获取文件夹内头像列表    imgList = os.listdir(folder)    #获取头像图片个数    numImages = len(imgList)    #设置头像裁剪后尺寸    eachSize = 100    #变量n用于循环遍历头像图片,即当所需图片大于头像总数时,循环使用头像图片    n=0    #变量count用于为最终生成的单字图片编号    count = 0    #img = Image.open(self)    #初始化颜色列表,用于背景着色:FFFACD黄色 #F0FFFF白  #BFEFFF 蓝  #b7facd青色 #ffe7cc浅橙色  #fbccff浅紫色 #d1ffb8淡绿 #febec0淡红 #E0EEE0灰    colorlist = ['#FFFACD','#F0FFFF','#BFEFFF','#b7facd','#ffe7cc','#fbccff','#d1ffb8','#febec0','#E0EEE0']    #index用来改变不同字的背景颜色    index = 0    #每个item对应不同字的点阵信息    for item in outlist:        #将工作路径转到头像所在文件夹        os.chdir(folder)        #新建一个带有背景色的画布,16*16点阵,每个点处填充2*2张头像图片,故长为16*2*100        #如果想要白色背景,将colorlist[index]改为'#FFFFFF'        canvas = Image.new('RGB', (3200, 3200), colorlist[index])  # 新建一块画布        #index变换,用于变换背景颜色        index = (index+1)%9        count += 1        #每个16*16点阵中的点,用四张100*100的头像来填充        for i in range(16*16):            #点阵信息为1,即代表此处要显示头像来组字            if item[i] == "1":                #循环读取连续的四张头像图片                x1 = n % len(imgList)                x2 = (n+1) % len(imgList)                x3 = (n+2) % len(imgList)                x4 = (n+3) % len(imgList)                #以下四组try,将读取到的四张头像填充到画板上对应的一个点位置                #点阵处左上角图片1/4                try:                    img = Image.open(imgList[x1])  # 打开图片                except IOError:                    print("有1位朋友的头像读取失败,已使用本人头像替代")  # 有些人没设置头像,就会有异常                    img = Image.open(self)                finally:                    img = img.resize((eachSize, eachSize), Image.ANTIALIAS)  # 缩小图片                    canvas.paste(img, ((i % 16) * 2 * eachSize, (i // 16) * 2 * eachSize))  # 拼接图片                # 点阵处右上角图片2/4                try:                    img = Image.open(imgList[x2])  # 打开图片                except IOError:                    print("有1位朋友的头像读取失败,已使用本人头像替代")  # 有些人没设置头像,就会有异常                    img = Image.open(self)                finally:                    img = img.resize((eachSize, eachSize), Image.ANTIALIAS)  # 缩小图片                    canvas.paste(img, (((i % 16) * 2 + 1) * eachSize, (i // 16) * 2 * eachSize))  # 拼接图片                # 点阵处左下角图片3/4                try:                    img = Image.open(imgList[x3])  # 打开图片                except IOError:                    print("有1位朋友的头像读取失败,已使用本人头像替代")  # 有些人没设置头像,就会有异常                    img = Image.open(self)                finally:                    img = img.resize((eachSize, eachSize), Image.ANTIALIAS)  # 缩小图片                    canvas.paste(img, ((i % 16) * 2 * eachSize, ((i // 16) * 2 + 1 ) * eachSize))  # 拼接图片                # 点阵处右下角图片4/4                try:                    img = Image.open(imgList[x4])  # 打开图片                except IOError:                    print("有1位朋友的头像读取失败,已使用本人头像替代")  # 有些人没设置头像,就会有异常                    img = Image.open(self)                finally:                    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)        # 创建文件夹用于存储输出结果        if not os.path.exists('{}_output'.format(user)):            os.mkdir('{}_output'.format(user))        os.chdir('{}_output'.format(user))        #quality代表图片质量,1-100        canvas.save('result%d.jpg'% count, quality=100)if __name__=="__main__":    #将想转化的字赋给字符串    inpt = "生日快乐,事事顺心!"    #将字转化为汉字库的点阵数据    outlist = char2bit(inpt)    #获取当前文件夹路径    workspace = os.getcwd()    #获取用户本人名称和用户本人头像路径    user,self = getHeadImgs()    #将头像图片按点阵拼接成单字图片    head2char(workspace,user,self,outlist)    print("Well done!")

注意修改:主函数中的inpt的汉字内容,同时注意window和linux中的路径中”\”和”/”的不同,进行修改否则会出错(对于pic2char.py也是一样的)
(2)pic2char.py是假设你想用别的图片来组成文字图片,无需获取微信头像,直接输入汉字用图片来拼接展示

使用

这里我使用的是python3.6

在运行代码前,需先安装PIL和itchat库

(1)无好友头像库的情况:

wx2char.py运行后,扫描二维码,即可登录并读取好友,等待片刻即可输出结果

(2)已下载好好友头像库的情况:

修改pic2char.py的路径,然后运行pic2char.py即可

Original: https://blog.51cto.com/u_15279692/5520737
Author: AI算法与图像处理
Title: python实现骚操作,表白神技:整个朋友圈都是爱你的样子

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/504718/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球