用python为心爱的人制作520照片墙,已成功做出效果图

马上又要进入一年一度的520了,作为一个地地道道的程序猿心里慌得一批。除了吃饭买礼物看电影好像就没有更多的想法了,于是想想将女友从以前到现在的所有照片整理了一下准备制作一个前所未有的照片墙。

【阅读全文】

当然,我在这里使用的照片是从百度拍摄的,私人照片不能公开,。

[En]

Of course, the photos I use here are taken from Baidu, and private photos cannot be made public, .

用python为心爱的人制作520照片墙,已成功做出效果图

那些没有女朋友的人也可以试一试,毕竟,以防有一天会有女朋友!

[En]

Those who do not have a girlfriend can also try, after all, in case there will be one day!

话不多说,进入正题吧,先将需要的非标准库梳理一下,只有一个PIL图像处理库,另外一个是os的标准库是用来操作文件的。

from PIL import Image
import os

然后,我们定义了一个由0和1组成的二维数组,并观察到0的位置组合成了一个心的形状。然后我们需要把我们需要的照片按照这个规则放在一起,形成一个心形的照片墙。

[En]

Then, we define a two-dimensional array, which is made up of 0 and 1, and observe that the position of 0 combines to form the shape of a heart. then we need to put the photos we need according to this rule to form a heart-shaped photo wall.

location = [
    [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],
]

需要注意的是0的数量其实就是照片的数量,所以尽可能的0的数量是需要小于等于照片的数量,可以根据自己的实际情况进行微调一下也是OK的。

由于我们自己的每一张照片的大小可能不一致,所以我们必须在放置后指定每一张照片的大小。

[En]

Since the size of each of our own photos may not be uniform, we must specify the size of each picture after placement.

img_w = img_h = 192  # 宽高都设置为192像素

计算location二维数组的行的个数、列的个数
rows = len(location)
columns = len(location[0])

使用每个图片的行数、列数和像素来计算目标画布的大小。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Use the number of rows, columns, and the pixels of each picture to calculate the size of the target canvas.</font>*</details>
canvas = Image.new("RGB", (img_w*columns, img_h*rows),"white")

我们需要把我们的照片放在这张画布上。

[En]

We need to put our pictures on this canvas.

让我们拍摄我们需要的材料照片,并设置材料图片(女友照片)所在的文件夹。

[En]

Let’s take the material photos we need and set up the folder where the material pictures (girlfriend photos) are located.

source_img_dir = r"C:\software\pycharm-workspace\the-public\test008\images"
source_imgs = os.listdir(source_img_dir)

没有女朋友的照片不要灰心,你可以去百度下载哈,你可以看看我之前的文章《百度图片下载2.0》下载了很多照片,呵呵!

[En]

Do not lose heart without girlfriend photos, you can go to Baidu to download ha, you can take a look at my previous article ‘Baidu Picture download 2.0’ to download a lot of photos, ha!

用python为心爱的人制作520照片墙,已成功做出效果图

然后,我们就可以生成我们期待的心形照片墙,进入收割。

[En]

Then we can generate the heart-shaped photo wall we are looking forward to and enter the harvest.

定义一个下标值,方便从我们的imgs数组里面取出照片。
index = 0

通过遍历二维数组中的行和列来放置我们的照片。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Put our photos in place by traversing the rows and columns in the two-dimensional array.</font>*</details>
for row in range(rows):

    for column in range(columns):

        # 若是当前二维数组中的元素为1时,表示该位置不在心形需要的位置上故不做处理。
        if location[row][column] == 1:

            continue

        # 若是当前二维数组中的元素为1时,需要将一张照片放到该位置上
        else:

            try:

                # 获取一张图片并打开为Image对象
                image = Image.open(os.path.join(source_img_dir, source_imgs[index]))

                # 重新设置当前照片的尺寸大小
                image = image.resize((img_w, img_h))

                # 将照片image对象,放在画布的特定位置
                canvas.paste(image, (img_w * column, img_h * row))

                # 递增图片列表中的图片下标
                index += 1

            except:

                continue

展示照片墙

canvas.show()

保存照片墙

canvas.save('心形-照片墙.png')

至此,终于讲完了,感谢您的陪伴和支持,我们将继续努力,做出更多精彩的内容!

[En]

At this point, finally finished, thank you for your company and support in the past, we will continue to work hard to make more wonderful content!

用python为心爱的人制作520照片墙,已成功做出效果图

【往期精彩】

两个库搞定python中引用javascript代码块/文件…

python实现excel数据与mysql数据库互通有无!

python 实现超快窗口截图,自动获取当前活动窗口并展示截图…

怎么用python做一个解压缩小工具,以后再也不用下载各种格式的解压缩软件了…

python中最简单的turtle绘图:奥运五环!

Original: https://www.cnblogs.com/lwsbc/p/16293701.html
Author: Python集中营
Title: 用python为心爱的人制作520照片墙,已成功做出效果图

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/499537/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球