–– coding:utf-8 ––
from PIL import Image
import os
import numpy as np
imgDir = r”/Volumes/DBA/python/img/”
bgImg = r”/Users/lpc/Downloads/494.jpg”
获取图像的均匀色彩值
def compute_mean(imgPath):
'''
获取图像均匀色彩值
:param imgPath: 缩略图门路
:return:(r,g,b)整个缩略图的 rgb 平均值
'''
im = Image.open(imgPath)
im = im.convert("RGB") # 转为 rgb 模式
# 把图像数据转为数据序列。以行为单位,每行存储每个像素点的色调
''' 如:[[60 33 24]
[58 34 24]
...
[188 152 136]
[99 96 113]]
[[60 33 24]
[58 34 24]
...
[188 152 136]
[99 96 113]]
'''
imArray = np.array(im)
# mean() 函数性能:求指定数据的取均值
R = np.mean(imArray[:, :, 0]) # 获取所有 R 值的平均值
G = np.mean(imArray[:, :, 1])
B = np.mean(imArray[:, :, 2])
return (R, G, B)
def getImgList():
"""
获取缩略图的门路及均匀色调
:return: list,[Skrill 下载](https://www.gendan5.com/wallet/Skrill.html) 存储了图片门路、均匀色调值。"""
imgList = []
for pic in os.listdir(imgDir):
imgPath = imgDir + pic
imgRGB = compute_mean(imgPath)
imgList.append({
"imgPath": imgPath,
"imgRGB": imgRGB
})
return imgList
def computeDis(color1, color2):
'''
计算两张图的色彩差,计算机的是色调空间间隔。dis = (R**2 + G**2 + B**2)**0.5
参数:color1,color2 是色调数据(r,g,b)'''
dis = 0
for i in range(len(color1)):
dis += (color1[i] - color2[i]) ** 2
dis = dis ** 0.5
return dis
def create_image(bgImg, imgDir, N=2, M=50):
'''
依据背景图,用头像填充出新图
bgImg:背景图地址
imgDir:头像目录
N:背景图缩放的倍率
M:头像的大小(MxM)'''
# 获取图片列表
imgList = getImgList()
# 读取图片
bg = Image.open(bgImg)
# bg = bg.resize((bg.size[0] // N, bg.size[1] // N)) # 缩放。倡议缩放下原图,图片太大运算工夫很长。bgArray = np.array(bg)
width = bg.size[0] * M # 新生成图片的宽度。每个像素倍放大 M 倍
height = bg.size[1] * M # 新生成图片的高度
# 创立空白的新图
newImg = Image.new('RGB', (width, height))
# 循环填充图
for x in range(bgArray.shape[0]): # x,行数据, 能够用原图宽代替
for y in range(bgArray.shape[1]): # y,列数据,, 能够用原图高代替
# 找到间隔最小的图片
minDis = 10000
index = 0
for img in imgList:
dis = computeDis(img['imgRGB'], bgArray[x][y])
if dis < minDis:
index = img['imgPath']
minDis = dis
# 循环结束,index 就是存储了色调最相近的图片门路
# minDis 存储了色调差值
# 填充
tempImg = Image.open(index) # 关上色差间隔最小的图片
# 调整图片大小,此处能够不调整,因为我在下载图的时候就曾经调整好了
tempImg = tempImg.resize((M, M))
# 把小图粘贴到新图上。留神 x,y,行列不要搞混了。相距 M 粘贴一张。newImg.paste(tempImg, (y * M, x * M))
print('(%d, %d)' % (x, y)) # 打印进度。格式化输入 x,y
# 保留图片
newImg.save('final.jpg') # 最初保留图片
create_image(bgImg, imgDir)