-- 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 = 0for i in range(len(color1)):    dis += (color1[i] - color2[i]) ** 2dis = dis ** 0.5return 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)