背景
每个人的手机中都存着很多美美的图片,每次发朋友圈的时候不知道怎么选择,怎么办?
小孩子才做选择题,把照片做成一面墙!我全都要!
像这样:
这样:
还有这样:
准备
做成这样一面墙,我们需要准备的内容如下:
大量美美哒图片PythonPIL模块
开工
博主准备了某群中新认识的110位朋友的头像进行操作(为了保命,博主没有摆出3000佳丽,原理相同,同志们自己观赏即可),下面开始筑墙吧!
准备需要的模块
from PIL import Image, ImageDraw, ImageFont# 解决读取图片报错from PIL import ImageFileImageFile.LOAD_TRUNCATED_IMAGES = Trueimport os
设置照片墙的样式(字符)
我们想要构造指定字符的照片墙就需要先构造出字符的背景样式,构造方式如下:
# 获取文字def gen_text_img(text, font_size, font_path=None):'''输入:text:照片墙的样式文字font_size:字体的大小font_path:字体返回:文字图像'''font = ImageFont.truetype(font_path, font_size)(width, length) = font.getsize(text)text_img = Image.new('RGBA', (width, length))draw = ImageDraw.Draw(text_img)# 从左上角开始绘制draw.text((0, 0), text, fill=(0, 0, 0), font=font)return text_img
设置透明度
接下来我们设置一下透明度,设置透明度的目的就是为了让文字周边区域的图片变的透明化,看起来更美观一些。
def trans_alpha(img, pixel):'''R:红G:绿B:蓝A:透明'''_, _, _, alpha = img.split()alpha = alpha.point(lambda i: pixel[-1] * 10)img.putalpha(alpha)return img
图片替换
下一步就要进行核心操作——图片替换了,这一步的主要目的就在于用我们手中的图片来替换设置字符背景墙时的空白区域。
def picture_wall_mask(text_img, edge_len, pic_dir):'''输入:text_img:文字图像edge_len:照片边长(用于扩大像素)pic_dir:路径'''# 像素扩大new_img = Image.new('RGBA', (text_img.size[0] * edge_len, text_img.size[1] * edge_len))file_list = os.listdir(pic_dir)img_index = 0for x in range(0, text_img.size[0]):for y in range(0, text_img.size[1]):pixel = text_img.getpixel((x, y))file_name = file_list[img_index % len(file_list)]try:# 导入图片img = Image.open(os.path.join(pic_dir, file_name)).convert('RGBA')img = img.resize((edge_len, edge_len))img = trans_alpha(img, pixel)# 进行替换new_img.paste(img,(x * edge_len, y * edge_len))img_index += 1except Exception as e:print(f"文件打开失败:{file_name} + {e}")return new_img
主函数
最后我们把上面准备的各种功能进行组合,就可以做出照片墙了。
def main(text='',font_size=20,edge_len=60,pic_dir="./微信头",out_dir="./out",font_path='buzz_cloud_font.ttf'):'''生成照片墙:param text: 照片墙字符样式:param font_size: 字体大小:param edge_len: sub picture's egde length'''if len(text) >= 1:text_ = ' '.join(text)print(f"generate text wall for '{text_}' with picture path:{pic_dir}")text_img = gen_text_img(text_, font_size, font_path)img_ascii = picture_wall_mask(text_img, edge_len, pic_dir)img_ascii.save(out_dir + os.path.sep + ''.join(text) + '.png')
main(text='CA')
大功告成
此处致敬所有新认识的朋友!Salute!
项目地址:/bigdatavalley/pic_wall