使用 Python 绘制透明多边形、加载位图和读取像素颜色的简单图形 API

98 阅读2分钟

一位开发者在 Stack Overflow 上寻求一个简单图形库,满足以下功能要求:

huake_00066_.jpg

  • 绘制多边形(不限于矩形)及具有 RGBA 颜色(即支持透明的部分)
  • 加载位图图像
  • 能够读取给定坐标的像素的当前颜色

该开发者偏好使用 JavaScript 或 Python,并且已经发现 HTML 5 Canvas 可以满足第二个和第三个要求,但无法满足第一个要求,而 SVG 可以满足第一个和第二个要求,但无法满足第三个要求。

2、解决方法

在 Stack Overflow 上,有几位开发者提供了可能的解决方案:

  • 一位开发者推荐使用 PyGame,因为它可以满足所有的功能要求,但它可能无法很好地嵌入到 GUI 中。
  • 另一位开发者最终选择了 Canvas,并透露多边形的“秘密”在于使用路径。
  • 还有人推荐使用 GameJs,它是一个功能更强大的 PyGame 式库,能够满足所有要求,并提供了详细的文档链接。

其中,第一个答案的代码示例如下:

import pygame

# 初始化 PyGame。
pygame.init()

# 创建一个游戏窗口。
screen = pygame.display.set_mode((640, 480))

# 设置多边形顶点。
points = [(100, 100), (200, 150), (300, 100), (200, 50)]

# 绘制多边形。
pygame.draw.polygon(screen, (255, 0, 0, 128), points, 0)

# 加载位图图像。
image = pygame.image.load("my_image.png")

# 将图像绘制到屏幕上。
screen.blit(image, (0, 0))

# 获取指定坐标的像素颜色。
color = screen.get_at((100, 100))

# 等待用户输入。
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 更新显示。
    pygame.display.update()

第二个答案的代码示例如下:

import pygame

# 初始化 PyGame。
pygame.init()

# 创建一个游戏窗口。
screen = pygame.display.set_mode((640, 480))

# 创建一个路径。
path = pygame.Path()

# 添加多边形顶点到路径。
path.add_polygon([(100, 100), (200, 150), (300, 100), (200, 50)])

# 设置路径的颜色。
path.set_color((255, 0, 0, 128))

# 将路径绘制到屏幕上。
pygame.draw.path(screen, path, 0)

# 加载位图图像。
image = pygame.image.load("my_image.png")

# 将图像绘制到屏幕上。
screen.blit(image, (0, 0))

# 获取指定坐标的像素颜色。
color = screen.get_at((100, 100))

# 等待用户输入。
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # 更新显示。
    pygame.display.update()

第三个答案的代码示例如下:

import gamejs

# 初始化 GameJs。
gamejs.init()

# 创建一个游戏窗口。
screen = gamejs.display.get_surface()

# 创建一个多边形。
polygon = gamejs.draw.polygon((255, 0, 0, 128), [(100, 100), (200, 150), (300, 100), (200, 50)])

# 将多边形绘制到屏幕上。
screen.blit(polygon)

# 加载位图图像。
image = gamejs.image.load("my_image.png")

# 将图像绘制到屏幕上。
screen.blit(image, (0, 0))

# 获取指定坐标的像素颜色。
color = screen.get_at((100, 100))

# 等待用户输入。
while True:
    for event in gamejs.event.get():
        if event.type == gamejs.QUIT:
            gamejs.quit()
            sys.exit()

    # 更新显示。
    gamejs.display.update()