温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python图片制作下如何用QQ好友头像拼接出里昂

发布时间:2021-10-09 17:50:24 来源:亿速云 阅读:125 作者:柒染 栏目:云计算

Python图片制作下如何用QQ好友头像拼接出里昂,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在本篇博客中,我们将实现两个功能:

  • 将所有头像合并为大图

  • 将所有头像以某个模板合成大图

同样,先给上所有运行效果图:

Python图片制作下如何用QQ好友头像拼接出里昂

代码实现

1、代码所需库

import requests,codecs,re,urllib,os,random,math
from PIL import Image
import numpy as np
import cv2 as cv

2、代码讲解

Python图片制作下如何用QQ好友头像拼接出里昂

2.1、将小头像合并为大图

对于这个,就是直接将每个小头像贴在大图上就行了,这个利用Image的paste函数就可以解决。对于贴的顺序就可以直接按照下面图示一个个贴:

Python图片制作下如何用QQ好友头像拼接出里昂

所以,直接给出代码:

def simple_split(filepackage,size,littlesize): #简单拼接,参数为图片文件名,每行每列的size,小头像图片的大小
  row = size[0]
  col = size[1]
  bigimg = Image.new('RGBA',(littlesize*row,littlesize*col))  #结果图
  number = 0
  for i in range(row):  #行
    for j in range(col):  #列
      randpic = random.randint(1,friends_count)
      img = Image.open(filepackage+str(randpic)+'.png').convert('RGBA')
      img = img.resize((littlesize,littlesize))
      loc = (i*littlesize,j*littlesize,(i+1)*littlesize,(j+1)*littlesize)
      print(loc,number)
      number+=1
      bigimg.paste(img,loc)
  bigimg.save(resultSavePath)

由于好友不多,所以我们每次就随机选择一个好友头像贴上去,所以如果你的密度大的话最后出现的头像有很多重复的头像。

给大家展示下最后我的图片吧:

Python图片制作下如何用QQ好友头像拼接出里昂

2.2、以某个图片为模板拼接图片

由于不清楚有没有能够直接做出来的第三方库,所有我就自己造了个小轮子。

思路:

将模板分为A x B的小图,就将它的位置形容为 pic[i][j] 吧,然后获取每个小图的平均RGB值,将 pic[i][j] 的平均RGB值和好友头像的RGB值做对比,找出最接近的头像,然后将该头像插入在图像的 pic[i][j] 处。

思路还是比较简单吧????

接下来就是实现了:代码很多地方都给出了注释,我就不多讲了,直接给出代码:

import requests,codecs,re,urllib,os,random,math
from PIL import Image
import numpy as np
import cv2 as cv

txtpath = 'C:/Users/11037/Desktop/test/qqfriends.txt'  #你从QQ邮箱中粘贴的文件
savepath = 'C:/Users/11037/Desktop/touxiang/'  #头像存储位置

resultSavePath = 'C:/Users/11037/Desktop/result2.png'   #结果存储位置
modePath = 'C:/Users/11037/Desktop/leno.jpg'    #模板存储位置

friends_count = 0   #好友数量
all_mean_rgbs = []   #存储计算出的所有平均rgb值

def meanrbg(img):  #计算图片平均rgb
  rgb = np.array(img)
  r = int(round(np.mean(rgb[:, :, 0])))
  g = int(round(np.mean(rgb[:, :, 1])))
  b = int(round(np.mean(rgb[:, :, 2])))
  return (r,g,b)

def gettouxiang(txtpath):#输入你的txt文件存储位置
  file = codecs.open(txtpath,'rb','utf-8')
  s = file.read()
  pattern = re.compile(r'\d+@qq.com')
  all_mail = pattern.findall(s)  #正则表达式匹配所有的qq号
  all_link = []  #用于存储需要访问的链接
  url = 'http://qlogo.store.qq.com/qzone/'
  for mail in all_mail:
    qq = mail.replace('@qq.com','')
    l = url + qq +'/'+qq+'/100'
    all_link.append(l)
  i = 1
  for link in all_link:   #遍历链接,下载头像
    saveurl = savepath+str(i)+'.png'
    savaImg(link,saveurl)
    i +=1
    print('已下载',i)
  friends_count = len(all_link) #获取朋友头像数量
  return True

def savaImg(picurl,saveurl):  #存储图片函数,picurl是图片的URL,saveurl是本地存储位置
  try:
    bytes = urllib.request.urlopen(picurl)
    file = open(saveurl,'wb')
    file.write(bytes.read())
    file.flush()
    file.close()
    return True
  except:
    print('worry')
    savaImg(picurl,saveurl)


def simple_split(filepackage,size,littlesize): #简单拼接,参数为图片文件名,每行每列的size,小头像图片的大小
  row = size[0]
  col = size[1]
  bigimg = Image.new('RGBA',(littlesize*row,littlesize*col))
  number = 0
  for i in range(row):
    for j in range(col):
      randpic = random.randint(1,friends_count)
      img = Image.open(filepackage+str(randpic)+'.png').convert('RGBA')
      img = img.resize((littlesize,littlesize))
      loc = (i*littlesize,j*littlesize,(i+1)*littlesize,(j+1)*littlesize)
      print(loc,number)
      number+=1
      bigimg.paste(img,loc)
  bigimg.save(resultSavePath)


def mode_split(filepackage,modepath,bigsize,littlesize):  #以模板存储头像
  row = bigsize[0] #大图每行多少个小头像
  col = bigsize[1] #每列
  suitSize = (littlesize*row,littlesize*col)  #大图最终的像素size
  bigImg = Image.open(modepath)
  bigImg = bigImg.resize(suitSize)
  resultImg = Image.new('RGBA',suitSize) 

  for i in range(row):
    for j in range(col):
      cutbox = (i*littlesize,j*littlesize,(i+1)*littlesize,(j+1)*littlesize)  #模板剪切用于对比的某个区域
      cutImg = bigImg.crop(cutbox) #复制到cutImg中
      tmprgb = meanrbg(cutImg) 
      suitOne = mostSuitImg(tmprgb) + 1  #对比出最合适的头像

      img = Image.open(filepackage + str(suitOne) + '.png').convert('RGBA')
      img = img.resize((littlesize,littlesize))
      resultImg.paste(img,cutbox)
      print('已粘贴',cutbox)
  resultImg.save(resultSavePath)  #存储


def mostSuitImg(tmprgb):  #进行对比,找出最合适的头像
  global all_mean_rgbs
  minRange = 200000
  id = 0
  for rgb in all_mean_rgbs:
    tmp = (rgb[1][0]-tmprgb[2])**2+(rgb[1][1]-tmprgb[1])**2+(rgb[1][2]-tmprgb[1])**2
    if tmp<minRange:
      minRange = tmp
      id = rgb[0]
  return id


if __name__ == '__main__':
  # gettouxiang(txtpath)   #获取头像,如果已经获取就可以给注释掉了
  # simple_split(savepath,(20,20),30)   #简单拼接
  
  #模板拼接
  for i in range(1,friends_count+1):
    img = cv.imread(savepath+str(i)+'.png')
    rgb = meanrbg(img)
    all_mean_rgbs.append(rgb)
  all_mean_rgbs = list(enumerate(all_mean_rgbs))  #给列表增加一个索引
  
  mode_split(savepath,modePath,(50,80),20)  #模板拼接
	```

给大家看看最终的效果:


![](https://oscimg.oschina.net/oscnet/up-c8362b863f6fba57e70a4465d35bb57d9c5.png)


这样一看还是都不错是吧。哈哈。


再给出里昂的模板和最终成果:



![](https://oscimg.oschina.net/oscnet/up-dae46d6af8e93aeb7bbff694bb49ba0fdf0.png)




![](https://oscimg.oschina.net/oscnet/up-a9a544a0204167bf1fb33c725a062fa3845.png)


添加【修改后的Leon】:



![](https://oscimg.oschina.net/oscnet/up-8a3c2a9abe4da2f6d1ebf761e71b1ecaa51.png)


我默认将每个头像以数字命名,可以便于后续的操作。


同时,以上代码都进行了封装,很多函数都可以独立使用,用于满足不同的功能。可以自己读完代码进行改写实现自己需要的功能,比如说以上我默认头像图片都是正方形,你如果图片有长方形的改变下代码也可以满足。


理论上来说,你的好友头像越多,制作出来的图片与模板的差异也就越小。以mode_split这个函数为例,你设置的bigsize越大,你的图片也就越清晰。


以上代码有不足的地方还请大家多多包涵。水平有限,我们,都在努力奔跑~

来源:blog.csdn.net/the_sangzi_home
[点这里:2021Python高薪实战学习大合集](https://ke.magedu.com/detail/i_5ef85d786e5f7_iHDka6sJ/1)**

[小白必学Python超详细实战教程典藏版【10W+人学习,98%好评】]
(https://ke.magedu.com/detail/p_6040e4fce4b05a6195bcdda9/6)


[Python框架Django开发实战]
(https://ke.magedu.com/detail/p_6040b010e4b0e51d821afbbf/6)


[企业级Python爬虫实战]
(https://ke.magedu.com/detail/p_6040ad37e4b07d825bd8b6a3/6)

关于Python图片制作下如何用QQ好友头像拼接出里昂问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI