如何在 pygame 中使用 SVG或者可能以更高的清晰度显示 PNG?

问题描述

我正在尝试使用 Pygame 制作国际象棋开局训练器。从图形上看,它非常简单;它像幻灯片一样工作,我一次只将单个图像传输到屏幕上,当我按下返回键时会更新。我正在使用 chess.svg 生成当前游戏状态的 SVG。无法在 pygame 中本地使用 SVG 意味着我一直在将 SVG 转换为 PNG。

在我的电脑上查看PNG,非常清晰。

PNG Image

但是当pygame显示图像时,它非常模糊。

Pygame Image

理想情况下,我希望 pygame 显示 SVG,因此我根本不必担心分辨率。我在 pygame 和 SVGs 上找到的只是 12 年前的 link。 2018 年,发布了一个答案,指出原来的方法不再有效。但是,现在,2018 年给出的方法在 2021 年也不再有效;我试过了,一条评论也证实了这一点。

如果无法使用 SVG,那很好,前提是我可以让 pygame 以比当前更高的定义显示 PNG。

即使我将 screen = pygame.display.set_mode((width,height)) 设为全屏,它仍然很模糊。我似乎无法找到任何相关信息,所以我不确定这是这里的问题。

这是我的代码的简化版本,用于演示图形部分:

import pygame
from pygame.locals import *
import chess
import cairosvg
import chess.svg
import chess.pgn

##Setup Pygame:
pygame.init()
 
width,height = 640,640
screen = pygame.display.set_mode((width,height))

## MAIN ##

board = chess.Board()
                
#Step 1: Create image
boardsvg = chess.svg.board(board=board)
f = open("image.SVG","w")
f.write(boardsvg)
f.close()

#scale
cairosvg.svg2png(url="image.svg",write_to="image_scaled.png",scale=3.0)

#Step2: Blit the image
image = pygame.image.load('image_scaled.png')
image = pygame.transform.scale(image,(640,640))
screen.blit(image,(0,0))
pygame.display.flip()

有人知道我需要尝试什么吗?

干杯。

解决方法

我发现像这样使用 smoothscale image = pygame.transform.smoothscale(image,(width,height)) 有一点帮助,但它仍然不完美。最后我决定使用 cm-chessboard 用 javascript 重写它。