[Python] 用 Pillow 来绘制北欧五国的国旗

背景

Pillow 中提供了关于 Pillow\text{Pillow} Pillow 模块的介绍。我想用 Pillow\text{Pillow} Pillow 来生成些简单的图案,以巩固学习的效果。北欧五国(即,瑞典、芬兰、挪威、丹麦、冰岛)的国旗图案比较简单,可以从这些国旗开始

说明:本文有不少文字是从 Python 用 turtle 来绘制北欧五国的国旗 一文复制的。

要点

这五个国家的国旗是这样的 ⬇️

考虑到瑞典、芬兰、丹麦的国旗的模式更为简单,本文会先分析瑞典国旗的绘制方法。有了瑞典国旗作为基础,只需要对代码做少量修改,就可以画出芬兰国旗和丹麦国旗。

在此基础上,我们可以画出挪威国旗和冰岛国旗。

正文

瑞典国旗

基本数据

根据 Sweden 网页所提供的信息,瑞典国旗中各部分的比例如下图所示

我在别的网站上搜到了瑞典国旗中,蓝色和黄色的具体数值(下图中给出了两组数值,我们就用 NCS\text{NCS} NCS 那一组吧)。

代码

我的整体思路是这样的 ⬇️

  1. 先构造合适大小的矩形
  2. 遍历矩形中的所有像素,判断每个像素应该是蓝色还是黄色

在此基础上,可以写出完整的 Python\text{Python} Python 代码 ⬇️ (trae 提供了一些帮助)

python 复制代码
from PIL import Image


# ===================== 常量定义 =====================
BLUE = (0, 85, 131)
YELLOW = (255, 194, 0)

PIXEL_CNT = 20

# 瑞典国旗的比例 (5:2:9 / 4:2:4)
LEFT_FIELD = 5 * PIXEL_CNT
CROSS_WIDTH = 2 * PIXEL_CNT
RIGHT_FIELD = 9 * PIXEL_CNT
TOP_FIELD = 4 * PIXEL_CNT
BOTTOM_FIELD = 4 * PIXEL_CNT


WIDTH = LEFT_FIELD + CROSS_WIDTH + RIGHT_FIELD
HEIGHT = TOP_FIELD + CROSS_WIDTH + BOTTOM_FIELD


img = Image.new('RGB', (WIDTH, HEIGHT))
pixels = img.load()

for x in range(WIDTH):
    for y in range(HEIGHT):
        if x >= LEFT_FIELD and x < (LEFT_FIELD + CROSS_WIDTH):
            pixels[x, y] = YELLOW
        elif y >= TOP_FIELD and y < (TOP_FIELD + CROSS_WIDTH):
            pixels[x, y] = YELLOW
        else:
            pixels[x, y] = BLUE


def main():
    img.show()
    img.save('sweden.png')


if __name__ == "__main__":
    main()

请将以上 Python\text{Python} Python 程序保存为 sweden.py\text{sweden.py} sweden.py。使用如下命令可以运行 sweden.py\text{sweden.py} sweden.py

bash 复制代码
python3 sweden.py

运行完之后,当前目录会生成一张名为 sweden.png\text{sweden.png} sweden.png 的图片。示例效果如下图所示

芬兰国旗

基本数据

根据 Finland 网页所提供的信息,芬兰国旗中各部分的比例如下图所示

我在别的网站上搜到了芬兰国旗中,白色和蓝色的具体数值 ⬇️

代码

上文已经展示了瑞典国旗的绘制方式,我们可以用类似的方式来绘制芬兰国旗 ⬇️

  1. 先构造合适大小的矩形
  2. 遍历矩形中的所有像素,判断每个像素应该是白色还是蓝色

在此基础上,可以写出完整的 Python\text{Python} Python 代码 ⬇️ (trae 提供了一些帮助)

python 复制代码
from PIL import Image


# ===================== 常量定义 =====================
WHITE = (255, 255, 255)
BLUE = (0, 47, 108)

PIXEL_CNT = 20

# 芬兰国旗的比例(5:3:10 / 4:3:4)
LEFT_FIELD = 5 * PIXEL_CNT
CROSS_WIDTH = 3 * PIXEL_CNT
RIGHT_FIELD = 10 * PIXEL_CNT
TOP_FIELD = 4 * PIXEL_CNT
BOTTOM_FIELD = 4 * PIXEL_CNT


WIDTH = LEFT_FIELD + CROSS_WIDTH + RIGHT_FIELD
HEIGHT = TOP_FIELD + CROSS_WIDTH + BOTTOM_FIELD


img = Image.new('RGB', (WIDTH, HEIGHT))
pixels = img.load()

for x in range(WIDTH):
    for y in range(HEIGHT):
        if x >= LEFT_FIELD and x < (LEFT_FIELD + CROSS_WIDTH):
            pixels[x, y] = BLUE
        elif y >= TOP_FIELD and y < (TOP_FIELD + CROSS_WIDTH):
            pixels[x, y] = BLUE
        else:
            pixels[x, y] = WHITE


def main():
    img.show()
    img.save('finland.png')


if __name__ == "__main__":
    main()

请将以上 Python\text{Python} Python 程序保存为 finland.py\text{finland.py} finland.py。使用如下命令可以运行 finland.py\text{finland.py} finland.py

bash 复制代码
python3 finland.py

运行完之后,当前目录会生成一张名为 finland.png\text{finland.png} finland.png 的图片。示例效果如下图所示

丹麦国旗

基本数据

根据 Denmark 网页所提供的信息,丹麦国旗中各部分的比例如下图所示

我在别的网站上搜到了丹麦国旗中,红色、白色的具体数值 ⬇️

代码

上文已经展示了瑞典国旗和芬兰国旗的绘制方式,我们可以用类似的方式来绘制丹麦国旗 ⬇️

  1. 先构造合适大小的矩形
  2. 遍历矩形中的所有像素,判断每个像素应该是红色还是白色

在此基础上,可以写出完整的 Python\text{Python} Python 代码 ⬇️ (trae 提供了一些帮助)

python 复制代码
from PIL import Image


# ===================== 常量定义 =====================
RED = (200, 16, 46)
WHITE = (255, 255, 255)

PIXEL_CNT = 20

# 丹麦国旗的比例(12:4:21 / 12:4:12)
LEFT_FIELD = 12 * PIXEL_CNT
CROSS_WIDTH = 4 * PIXEL_CNT
RIGHT_FIELD = 21 * PIXEL_CNT
TOP_FIELD = 12 * PIXEL_CNT
BOTTOM_FIELD = 12 * PIXEL_CNT


WIDTH = LEFT_FIELD + CROSS_WIDTH + RIGHT_FIELD
HEIGHT = TOP_FIELD + CROSS_WIDTH + BOTTOM_FIELD


img = Image.new('RGB', (WIDTH, HEIGHT))
pixels = img.load()

for x in range(WIDTH):
    for y in range(HEIGHT):
        if x >= LEFT_FIELD and x < (LEFT_FIELD + CROSS_WIDTH):
            pixels[x, y] = WHITE
        elif y >= TOP_FIELD and y < (TOP_FIELD + CROSS_WIDTH):
            pixels[x, y] = WHITE
        else:
            pixels[x, y] = RED


def main():
    img.show()
    img.save('denmark.png')


if __name__ == "__main__":
    main()

请将以上 Python\text{Python} Python 程序保存为 denmark.py\text{denmark.py} denmark.py。使用如下命令可以运行 denmark.py\text{denmark.py} denmark.py

bash 复制代码
python3 denmark.py

运行完之后,当前目录会生成一张名为 denmark.png\text{denmark.png} denmark.png 的图片。示例效果如下图所示

挪威国旗

基本数据

根据 Norway 网页所提供的信息,挪威国旗中各部分的比例如下图所示

我在别的网站上搜到了挪威国旗中,红色、白色和蓝色的具体数值 ⬇️

代码

上文已经展示了瑞典国旗、芬兰国旗、丹麦国旗的绘制方式,我们可以用类似的方式来绘制挪威国旗 ⬇️

  1. 先构造合适大小的矩形
  2. 遍历矩形中的所有像素,判断每个像素应该是蓝色、白色还是红色

在此基础上,可以写出完整的 Python\text{Python} Python 代码 ⬇️ (trae 提供了一些帮助)

python 复制代码
from PIL import Image


# ===================== 常量定义 =====================
WHITE = (255, 255, 255)
BLUE = (0, 54, 152)
RED = (210, 16, 52)

PIXEL_CNT = 20

# 挪威国旗的比例(6:1:2:1:12 / 6:1:2:1:6)
LEFT_FIELD = 6 * PIXEL_CNT
BIG_CROSS_WIDTH = 4 * PIXEL_CNT
SMALL_CROSS_WIDTH = 2 * PIXEL_CNT
CROSS_GAP_WIDTH = 1 * PIXEL_CNT
RIGHT_FIELD = 12 * PIXEL_CNT
TOP_FIELD = 6 * PIXEL_CNT
BOTTOM_FIELD = 6 * PIXEL_CNT

WIDTH = LEFT_FIELD + BIG_CROSS_WIDTH + RIGHT_FIELD
HEIGHT = TOP_FIELD + BIG_CROSS_WIDTH + BOTTOM_FIELD


img = Image.new('RGB', (WIDTH, HEIGHT))
pixels = img.load()

for x in range(WIDTH):
    for y in range(HEIGHT):
        if (
            x >= LEFT_FIELD + CROSS_GAP_WIDTH
            and x < (LEFT_FIELD + CROSS_GAP_WIDTH + SMALL_CROSS_WIDTH)
        ):
            pixels[x, y] = BLUE
        elif (
            y >= TOP_FIELD + CROSS_GAP_WIDTH
            and y < (TOP_FIELD + CROSS_GAP_WIDTH + SMALL_CROSS_WIDTH)
        ):
            pixels[x, y] = BLUE
        elif x >= LEFT_FIELD and x < (LEFT_FIELD + BIG_CROSS_WIDTH):
            pixels[x, y] = WHITE
        elif y >= TOP_FIELD and y < (TOP_FIELD + BIG_CROSS_WIDTH):
            pixels[x, y] = WHITE
        else:
            pixels[x, y] = RED


def main():
    img.show()
    img.save('norway.png')


if __name__ == "__main__":
    main()

请将以上 Python\text{Python} Python 程序保存为 norway.py\text{norway.py} norway.py。使用如下命令可以运行 norway.py\text{norway.py} norway.py

bash 复制代码
python3 norway.py

运行完之后,当前目录会生成一张名为 norway.png\text{norway.png} norway.png 的图片。示例效果如下图所示

冰岛国旗

基本数据

根据 Iceland 网页所提供的信息,冰岛国旗中各部分的比例如下图所示

我在别的网站上搜到了挪威国旗中,红色、白色和蓝色的具体数值 ⬇️

代码

上文已经展示了挪威国旗的绘制方式,我们可以用类似的方式来绘制冰岛国旗 ⬇️

  1. 先构造合适大小的矩形
  2. 遍历矩形中的所有像素,判断每个像素应该是红色、白色还是蓝色

在此基础上,可以写出完整的 Python\text{Python} Python 代码 ⬇️ (trae 提供了一些帮助)

python 复制代码
from PIL import Image


# ===================== 常量定义 =====================
WHITE = (255, 255, 255)
BLUE = (2, 82, 156)
RED = (220, 30, 53)


PIXEL_CNT = 20

# 冰岛国旗的比例(7:1:2:1:14 / 7:1:2:1:7)
LEFT_FIELD = 7 * PIXEL_CNT
BIG_CROSS_WIDTH = 4 * PIXEL_CNT
SMALL_CROSS_WIDTH = 2 * PIXEL_CNT
CROSS_GAP_WIDTH = 1 * PIXEL_CNT
RIGHT_FIELD = 14 * PIXEL_CNT
TOP_FIELD = 7 * PIXEL_CNT
BOTTOM_FIELD = 7 * PIXEL_CNT

WIDTH = LEFT_FIELD + BIG_CROSS_WIDTH + RIGHT_FIELD
HEIGHT = TOP_FIELD + BIG_CROSS_WIDTH + BOTTOM_FIELD


img = Image.new('RGB', (WIDTH, HEIGHT))
pixels = img.load()

for x in range(WIDTH):
    for y in range(HEIGHT):
        if (
            x >= LEFT_FIELD + CROSS_GAP_WIDTH
            and x < (LEFT_FIELD + CROSS_GAP_WIDTH + SMALL_CROSS_WIDTH)
        ):
            pixels[x, y] = RED
        elif (
            y >= TOP_FIELD + CROSS_GAP_WIDTH
            and y < (TOP_FIELD + CROSS_GAP_WIDTH + SMALL_CROSS_WIDTH)
        ):
            pixels[x, y] = RED
        elif x >= LEFT_FIELD and x < (LEFT_FIELD + BIG_CROSS_WIDTH):
            pixels[x, y] = WHITE
        elif y >= TOP_FIELD and y < (TOP_FIELD + BIG_CROSS_WIDTH):
            pixels[x, y] = WHITE
        else:
            pixels[x, y] = BLUE


def main():
    img.show()
    img.save('iceland.png')


if __name__ == "__main__":
    main()

请将以上 Python\text{Python} Python 程序保存为 iceland.py\text{iceland.py} iceland.py。使用如下命令可以运行 iceland.py\text{iceland.py} iceland.py

bash 复制代码
python3 iceland.py

运行完之后,当前目录会生成一张名为 iceland.png\text{iceland.png} iceland.png 的图片。示例效果如下图所示

参考资料

相关推荐
4SAPI4 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
XCDoris6 小时前
郴州logo设计机构
大数据·人工智能·python
gCode Teacher 格码致知6 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
马良神笔7 小时前
2026 年Rag最近技术前沿总结
后端·python·django
不像程序员的程序媛8 小时前
maven基础
python·pycharm·maven
xiaogai_gai9 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
benchmark_cc9 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu9 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
估值探索者10 小时前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口
田里的水稻11 小时前
PyTorch_Dataloader\TensorBoard---数据加载与可视化
人工智能·pytorch·python·神经网络·机器学习