最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

有趣的Python圖片制作之如何用QQ好友頭像拼接出里昂

 更新時間:2020年04月22日 10:20:17   作者:桑梓之南  
這篇文章主要介紹了有趣的Python圖片制作之如何用QQ好友頭像拼接出里昂,本文通過截圖實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

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

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

在這里插入圖片描述

代碼實現(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郵箱獲取好友信息并爬取頭像

現(xiàn)在,我們已經(jīng)有了所有的好友頭像,接下來我們先實現(xiàn)對所有頭像的集合咯

在這里插入圖片描述

2.1、將小頭像合并為大圖

對于這個,就是直接將每個小頭像貼在大圖上就行了,這個利用Image的paste函數(shù)就可以解決。對于貼的順序就可以直接按照下面圖示一個個貼:

在這里插入圖片描述

所以,直接給出代碼:

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)的頭像有很多重復的頭像。

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

在這里插入圖片描述

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)  #獲取頭像,如果已經(jīng)獲取就可以給注釋掉了
	# 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) #模板拼接

給大家看看最終的效果:

在這里插入圖片描述

這樣一看還是都不錯是吧。哈哈。

再給出里昂的模板和最終成果:

在這里插入圖片描述
在這里插入圖片描述
添加【修改后的Leon】:
在這里插入圖片描述

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

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

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

到此這篇關于有趣的Python圖片制作之如何用QQ好友頭像拼接出里昂的文章就介紹到這了,更多相關python 好友頭像拼接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python實現(xiàn)計算最小編輯距離

    Python實現(xiàn)計算最小編輯距離

    這篇文章主要介紹了Python實現(xiàn)計算最小編輯距離的相關代碼,有需要的小伙伴可以參考下
    2016-03-03
  • python操作gitlab API過程解析

    python操作gitlab API過程解析

    這篇文章主要介紹了python操作gitlab API過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 淺析Python中接口與抽象基類的使用

    淺析Python中接口與抽象基類的使用

    這篇文章主要為大家詳細介紹了Python中兩個為面向?qū)ο缶幊烫峁┑膹姶蠊ぞ呓涌诤统橄蠡惖氖褂?感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • 基于python指定包的安裝路徑方法

    基于python指定包的安裝路徑方法

    今天小編就為大家分享一篇基于python指定包的安裝路徑方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 重命名批處理python腳本

    重命名批處理python腳本

    師兄采集的視網(wǎng)膜圖像放在一個文件夾下,由于分類十分混亂,因此出現(xiàn)了一個文件多次出現(xiàn)的情況,因此讓我寫了個腳本
    2013-04-04
  • Python基礎之變量基本用法與進階詳解

    Python基礎之變量基本用法與進階詳解

    這篇文章主要介紹了Python基礎之變量基本用法與進階,結合實例形式詳細分析了Python變量引用、可變和不可變類型、局部變量和全局變量等相關原理與使用技巧,需要的朋友可以參考下
    2020-01-01
  • Python獲取網(wǎng)段內(nèi)ping通IP的方法

    Python獲取網(wǎng)段內(nèi)ping通IP的方法

    今天小編就為大家分享一篇Python獲取網(wǎng)段內(nèi)ping通IP的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 使用Python為Excel文件添加預設和自定義文檔屬性

    使用Python為Excel文件添加預設和自定義文檔屬性

    向Excel文件添加文檔屬性是專業(yè)地組織和管理電子表格數(shù)據(jù)的關鍵步驟,這些屬性,如標題、作者、主題和關鍵詞,增強了文件的元數(shù)據(jù),使得在大型數(shù)據(jù)庫或文件系統(tǒng)中跟蹤變得更加容易,本文將介紹如何使用Python高效地為Excel文件添加文檔屬性,需要的朋友可以參考下
    2024-05-05
  • Web服務器框架 Tornado簡介

    Web服務器框架 Tornado簡介

    Tornado Web Server 是使用Python編寫出來的一個極輕量級、高可伸縮性和非阻塞IO的Web服務器軟件,著名的 Friendfeed 網(wǎng)站就是使用它搭建的。
    2014-07-07
  • Python中的yield全方位解讀

    Python中的yield全方位解讀

    這篇文章主要介紹了Python中的yield全方位解讀,在 Python 中,使用了 yield 的函數(shù)被稱為生成器,跟普通函數(shù)不同的是,生成器是一個返回迭代器的函數(shù),只能用于迭代操作,更簡單點理解生成器就是一個迭代器,需要的朋友可以參考下
    2023-08-08

最新評論

锦州市| 阳信县| 台安县| 天津市| 奉贤区| 堆龙德庆县| 龙南县| 朝阳区| 罗源县| 德庆县| 南丹县| 阜城县| 灌南县| 宁南县| 班戈县| 营山县| 镇康县| 昌宁县| 武陟县| 富锦市| 长岭县| 松原市| 扎兰屯市| 威海市| 通州市| 富裕县| 新民市| 尚义县| 华亭县| 阳山县| 临桂县| 敖汉旗| 子洲县| 缙云县| 平陆县| 富源县| 永康市| 宜城市| 盈江县| 石楼县| 武夷山市|