背景
每个人的手机中都存着很多美美的图片,每次发朋友圈的时候不知道怎么选择,怎么办?
小孩子才做选择题,把照片做成一面墙!我全都要!
像这样:
这样:
还有这样:
准备
做成这样一面墙,我们需要准备的内容如下:
- 大量美美哒图片
- Python
- PIL模块
开工
博主准备了某群中新认识的110位朋友的头像进行操作(为了保命,博主没有摆出3000佳丽,原理相同,同志们自己观赏即可),下面开始筑墙吧!
准备需要的模块
from PIL import Image, ImageDraw, ImageFont # 解决读取图片报错 from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True import 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 = 0 for 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 += 1 except 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!
项目地址:https://github.com/bigdatavalley/pic_wall
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/169134.html