溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2021-10-09 17:50:24 來源:億速云 閱讀:153 作者:柒染 欄目:云計算

Python圖片制作下如何用QQ好友頭像拼接出里昂,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

在本篇博客中,我們將實現(xiàn)兩個功能:

  • 將所有頭像合并為大圖

  • 將所有頭像以某個模板合成大圖

同樣,先給上所有運行效果圖:

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

代碼實現(xiàn)

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函數(shù)就可以解決。對于貼的順序就可以直接按照下面圖示一個個貼:

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

所以,直接給出代碼:

def simple_split(filepackage,size,littlesize): #簡單拼接,參數(shù)為圖片文件名,每行每列的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)

由于好友不多,所以我們每次就隨機選擇一個好友頭像貼上去,所以如果你的密度大的話最后出現(xiàn)的頭像有很多重復的頭像。

給大家展示下最后我的圖片吧:

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

2.2、以某個圖片為模板拼接圖片

由于不清楚有沒有能夠直接做出來的第三方庫,所有我就自己造了個小輪子。

思路:

將模板分為A x B的小圖,就將它的位置形容為 pic[i][j] 吧,然后獲取每個小圖的平均RGB值,將 pic[i][j] 的平均RGB值和好友頭像的RGB值做對比,找出最接近的頭像,然后將該頭像插入在圖像的 pic[i][j] 處。

思路還是比較簡單吧????

接下來就是實現(xiàn)了:代碼很多地方都給出了注釋,我就不多講了,直接給出代碼:

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   #好友數(shù)量
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) #獲取朋友頭像數(shù)量
  return True

def savaImg(picurl,saveurl):  #存儲圖片函數(shù),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): #簡單拼接,參數(shù)為圖片文件名,每行每列的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)  #模板剪切用于對比的某個區(qū)域
      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)


我默認將每個頭像以數(shù)字命名,可以便于后續(xù)的操作。


同時,以上代碼都進行了封裝,很多函數(shù)都可以獨立使用,用于滿足不同的功能??梢宰约鹤x完代碼進行改寫實現(xiàn)自己需要的功能,比如說以上我默認頭像圖片都是正方形,你如果圖片有長方形的改變下代碼也可以滿足。


理論上來說,你的好友頭像越多,制作出來的圖片與模板的差異也就越小。以mode_split這個函數(shù)為例,你設置的bigsize越大,你的圖片也就越清晰。


以上代碼有不足的地方還請大家多多包涵。水平有限,我們,都在努力奔跑~

來源:blog.csdn.net/the_sangzi_home
[點這里:2021Python高薪實戰(zhàn)學習大合集](https://ke.magedu.com/detail/i_5ef85d786e5f7_iHDka6sJ/1)**

[小白必學Python超詳細實戰(zhàn)教程典藏版【10W+人學習,98%好評】]
(https://ke.magedu.com/detail/p_6040e4fce4b05a6195bcdda9/6)


[Python框架Django開發(fā)實戰(zhàn)]
(https://ke.magedu.com/detail/p_6040b010e4b0e51d821afbbf/6)


[企業(yè)級Python爬蟲實戰(zhàn)]
(https://ke.magedu.com/detail/p_6040ad37e4b07d825bd8b6a3/6)

關于Python圖片制作下如何用QQ好友頭像拼接出里昂問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業(yè)資訊頻道了解更多相關知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI