Python制作心形照片墙:基于Pillow的二维数组布局实现

木白
木白
发布时间:2026-10-14| 4人浏览过
原创

本文介绍如何使用Python的Pillow库制作心形照片墙。核心思路是利用二维数组定义图片位置,其中0代表放置图片,1代表留白。通过计算画布尺寸并遍历数组,将指定数量的图片按坐标粘贴至白色背景上,最终生成并保存为PNG格式的心形图案。

本文分享利用Python制作心形照片墙的具体方法,供读者参考。

效果展示

首先预览最终生成的效果图,以便明确制作目标。实际效果如下所示:

若对效果满意,欢迎点赞支持。掌握此方法后,你也能轻松制作出类似作品,这也是对作者的一种鼓励。

实现思路

在编写代码前,需先梳理整体逻辑。只有理清步骤,才能准确实现预期效果。

制作难点在于计算每张图片的具体坐标以拼合出心形。为避免复杂的数学计算,本文采用“硬编码”方式直接指定位置。虽然略显繁琐,但这种方法灵活性高。

可将心形图案想象为由多个单元格组成的表格,单元格大小等同于图片尺寸,且无边框。制作时,只需在对应单元格内放置图片并排列成心形即可。以下是具体代码实现。

环境准备

制作过程依赖以下Python库,需提前安装好相关工具。

1. pillow:处理图像的第三方库,需通过命令 pip install pillow 安装。

2. os:Python内置库,用于获取文件列表,无需额外安装。

3. math:Python内置库,用于辅助计算图片数量,无需额外安装。

具备上述三个库即可开始编码。

代码实现

第一步:导入所需库。


from PIL import Image
import os
import math

第二步:定义心形图案结构。

通过二维数组确定图片位置,数组元素中1表示空白区域,0表示放置图片的位置。由0构成的图案即为心形。此处为手写数据,因此可根据需求自由修改数组,自定义其他形状,体现其灵活性。

由于示例中使用500张图片,为呈现更大规模效果,数组尺寸设定为21x21。

注意:数组中0的数量必须小于或等于图片总数,否则无法完整显示心形图案。


map = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
    [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
    [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
    [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]

第三步:加载图片资源。

位置确定后,开始获取所有待处理的图片文件。


# 这个是我图片的所在路径
img_dir = r"C:\Users\admin\Desktop\头像"
# 获取这个文件下的所有文件,因为没有过滤其他类型文件,所以不要放非图片文件
# 返回的是一个列表
imgs = os.listdir(img_dir)
# 设置图片的尺寸,所有图片尺寸要保持统一,要有组织有纪律
img_h = img_w = 192
# 计算行数,即子列表的个数
rows = len(map)
# 计算列数,即子列表中元素的个数
columns = len(map[0])

绘图处理

接下来创建白色背景作为画布。根据图片宽高、行数和列数,可计算出画布的总尺寸。


# 第一个参数照着写
# 第二个参数需要传入一个元组,元组的第一个参数是画布的宽,第二个是高
# 第三个参数传入的是画布的颜色
# 使用Image.new()方法创建一个画布
figure = Image.new("RGB", (img_w*columns, img_h*rows),"white")

此时图片和画布均已准备就绪,下一步是将图片粘贴到画布上对应坐标位置,即数组元素为0的位置。


# 表示图片的下标
count = 0
# 遍历行
for i in range(len(map)):
    # 遍历每行中的所有元素
    for j in range(len(map[i])):
        # 如果元素是1,就不管它
        if map[i][j] == 1:
            continue
        # 如果元素是非1,即0就放图片上去
        else:
            # 做个异常处理,防止有些图片打开失败,导致程序中断
            try:
                # 使用Image.open("图片路径")方法获取图片对象
                image = Image.open(os.path.join(img_dir, imgs[count]))
            except:
                continue
            # resize((新的宽,新的高))用来改变图片的尺寸,接收一个元组
            image = image.resize((img_w, img_h))
            # 将修改尺寸后的图片(image)粘贴(paste)到画布(figure)上
            # 第一个参数 是图片对象
            # 第二个参数是 图片在画布上的位置,相当于单元格的位置
            figure.paste(image, (img_w*j, img_h*i))
            # 使用完一张图片就要记录下来,并开始使用下一张图片
            count += 1
        
# 当循环结束,即表示心型照片图已经完成
# 将画好的画布显示出来,给你看到
figure.show()
# 不满意在调整二维数组中0的位置,满意可以保存到本地,用来装逼
# 需要告知程序图片保存的路径
figure.save('心型照片墙.png')

至此,心形照片墙制作完成。若你有伴侣,可使用其照片配合红色背景生成图片发送,或许能增进感情(效果见下图)。也可添加“I love you”字样。可惜作者暂无此类素材,令人遗憾。

以上就是本文的全部内容,希望能为读者提供学习帮助,并感谢大家的支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。