震惊!为了欣赏后宫的3000佳丽,我竟然用Python做出了一面墙?

简介: 震惊!为了欣赏后宫的3000佳丽,我竟然用Python做出了一面墙?

背景

每个人的手机中都存着很多美美的图片,每次发朋友圈的时候不知道怎么选择,怎么办?

小孩子才做选择题,把照片做成一面墙!我全都要!

像这样:

image.png

这样:

image.png还有这样:

image.png

准备

做成这样一面墙,我们需要准备的内容如下:

  • 大量美美哒图片
  • 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

相关文章
|
17天前
|
算法 定位技术 Python
震惊!Python 图结构竟然可以这样玩?DFS&BFS 遍历技巧大公开
在 Python 编程中,图是一种重要的数据结构,而深度优先搜索(DFS)和广度优先搜索(BFS)是遍历图的两种关键算法。本文将通过定义图的数据结构、实现 DFS 和 BFS 算法,并通过具体示例展示其应用,帮助读者深入理解这两种算法。DFS 适用于寻找路径和检查图连通性,而 BFS 适用于寻找最短路径。掌握这些技巧,可以更高效地解决与图相关的复杂问题。
27 2
|
3月前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
40 4
|
3月前
|
网络协议 安全 网络安全
震惊!Python Socket竟能如此玩转网络通信,基础到进阶全攻略!
【9月更文挑战第12天】在网络通信中,Socket编程是连接不同应用与服务的基石。本文通过问答形式,从基础到进阶全面解析Python Socket编程。涵盖Socket的重要性、创建TCP服务器与客户端、处理并发连接及进阶话题如非阻塞Socket、IO多路复用等,帮助读者深入了解并掌握网络通信的核心技术。
89 6
|
5月前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
【7月更文挑战第23天】在Python算法设计中,时间与空间复杂度是幕后操控程序效率的双雄。时间复杂度反映算法执行时间随输入规模增长的速度,空间复杂度则计量算法运行时额外内存的使用。如顺序查找的时间复杂度O(n)与固定空间O(1),对比冒泡排序的O(n^2)时间和快速排序的O(n log n)时间优势,后者虽递归消耗空间,但在多数情况下提供更佳性能。根据需求,可权衡选择,如利用哈希表在充足内存下实现O(1)查找,或在空间受限时,偏好空间效率更高的算法,实现Python代码的高性能与优雅。
47 6
|
5月前
|
算法 搜索推荐 数据处理
震惊!Python算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
【7月更文挑战第24天】在编程世界里, Python以简洁强大备受欢迎, 但算法设计与复杂度分析对程序性能至关重要。算法是程序的灵魂, 其效率直接影响数据处理能力。时间复杂度衡量算法执行速度, 如冒泡排序O(n²)与快速排序O(n log n)的显著差异; 空间复杂度关注内存占用, 递归算法需警惕栈溢出风险。优秀算法需平衡时间和空间效率, 深入理解问题本质, 迭代优化实现高效可靠。
38 2
|
5月前
|
存储 Python
震惊!Python并查集:解锁数据结构新姿势,让你从菜鸟秒变大神!
【7月更文挑战第18天】并查集,一种处理不相交集合的树形数据结构,支持Union(合并)和Find(查询)操作。Python实现中,用字典存储元素及其父节点,初始时每个元素为根。通过路径压缩提高效率。应用包括网络连通性判断、动态连通性检测和集合操作。掌握并查集,提升编程技能,解决复杂问题。开始探索,成为数据结构大师!
43 5
|
5月前
|
算法 定位技术 Python
震惊!Python 图结构竟然可以这样玩?DFS&BFS 遍历技巧大公开
【7月更文挑战第12天】在Python中,图数据结构通过邻接表实现,如`Graph`类所示。深度优先搜索(DFS)和广度优先搜索(BFS)是图遍历的关键算法。DFS递归遍历从起点开始的分支,常用于路径查找和连通性检查;BFS使用队列,适用于找最短路径。
47 3
|
5月前
|
网络协议 安全 网络安全
震惊!Python Socket竟能如此玩转网络通信,基础到进阶全攻略!
【7月更文挑战第27天】在网络通信中, Python Socket编程是基石。Socket是程序间数据传输的端点, Python的`socket`模块简化了网络通信的实现。
38 0
|
5月前
|
API 数据库 C++
震惊!Python并发编程大揭秘:线程(threading)VS进程(multiprocessing),你选对了吗?
【7月更文挑战第8天】在Python并发编程中,线程适合I/O密集型任务,如实时订单处理,而进程适合CPU密集型任务,如商品信息同步。线程利用轻量级并发,处理I/O等待时切换成本低;进程通过multiprocessing模块充分利用多核CPU。根据任务类型选择合适工具,能提升效率并优化系统性能。理解和运用线程与进程,是解决并发问题的关键。
39 0
|
7月前
|
前端开发 JavaScript Python
使用Python读取本地行情csv文件,做出web网页画出K线图实现案例
【5月更文挑战第4天】使用Python绘制K线图的步骤:1) 安装pandas, matplotlib和Flask;2) 用pandas读取CSV文件并处理数据;3) 创建Flask应用,渲染包含K线图数据的HTML;4) 编写HTML,使用ECharts库绘制K线图。
87 0