商城首页欢迎来到中国正版软件门户

您的位置:首页 >[Python] 用 Pillow 来绘制北欧五国的国旗

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

  发布于2026-07-31 阅读(0)

扫一扫,手机访问

背景

Pillow 这个库,大家应该都不陌生。这次想用 Pillow 来生成一些简单的图案,巩固一下学习成果。北欧五国——瑞典、芬兰、挪威、丹麦、冰岛——的国旗图案都比较简洁,是个不错的切入点。

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

要点

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

先挑软柿子捏——从瑞典、芬兰、丹麦这几个模式更简单的入手。等把瑞典的套路摸透了,改几行代码就能搞定芬兰和丹麦。在此基础上,再进一步,挪威和冰岛也不在话下。

正文

瑞典国旗

基本数据

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

颜色值方面,网上搜到了两组数据,下面就用 NCS 那组。

代码

整体的思路很直接 ⬇️

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

照着这个思路,完整代码如下 ⬇️ (trae 提供了一些帮助)

 复制代码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.sa ve('sweden.png')
if __name__ == "__main__":
    main()

把代码保存为 sweden.pytext{sweden.py},运行命令:

 复制代码python3 sweden.py

当前目录下会生成一张 sweden.pngtext{sweden.png},效果如下:

芬兰国旗

基本数据

根据 Finland 网页上的信息,芬兰国旗各部分的比例如下图:

颜色值也找到了,白色和蓝色的具体数值 ⬇️

代码

有瑞典国旗打底,芬兰国旗的画法基本就是照葫芦画瓢 ⬇️

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

完整代码如下 ⬇️ (trae 提供了一些帮助)

 复制代码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.sa ve('finland.png')
if __name__ == "__main__":
    main()

保存为 finland.pytext{finland.py},运行:

 复制代码python3 finland.py

生成 finland.pngtext{finland.png},效果如下:

丹麦国旗

基本数据

根据 Denmark 网页上的信息,丹麦国旗各部分的比例如下图:

红色和白色的具体数值 ⬇️

代码

同理,丹麦国旗的绘制思路几乎是一样的 ⬇️

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

完整代码如下 ⬇️ (trae 提供了一些帮助)

 复制代码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.sa ve('denmark.png')
if __name__ == "__main__":
    main()

保存为 denmark.pytext{denmark.py},运行:

 复制代码python3 denmark.py

生成 denmark.pngtext{denmark.png},效果如下:

挪威国旗

基本数据

根据 Norway 网页上的信息,挪威国旗各部分的比例如下图:

红色、白色和蓝色的具体数值 ⬇️

代码

到这里,套路已经很清晰了。挪威国旗的难点在于多了一层十字,但逻辑上仍然是像素的逐层判断 ⬇️

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

完整代码如下 ⬇️ (trae 提供了一些帮助)

 复制代码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_CNTWIDTH = 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.sa ve('norway.png')
if __name__ == "__main__":
    main()

保存为 norway.pytext{norway.py},运行:

 复制代码python3 norway.py

生成 norway.pngtext{norway.png},效果如下:

冰岛国旗

基本数据

根据 Iceland 网页上的信息,冰岛国旗各部分的比例如下图:

冰岛国旗和挪威国旗的结构非常相似,只是颜色不同。具体数值如下 ⬇️

代码

既然模式几乎一模一样,代码的改动量自然也很小 ⬇️

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

完整代码如下 ⬇️ (trae 提供了一些帮助)

 复制代码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_CNTWIDTH = 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.sa ve('iceland.png')
if __name__ == "__main__":
    main()

保存为 iceland.pytext{iceland.py},运行:

 复制代码python3 iceland.py

生成 iceland.pngtext{iceland.png},效果如下:

参考资料

  • Pillow
  • [Python] 用 turtle 来绘制北欧五国的国旗 (我写的另一篇文章)
本文转载于:https://juejin.cn/post/7667392214843932735 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注