如何将 SVG 与 pygame 一起使用(或者以更高的清晰度显示 PNG)?
How can I use SVGs with pygame (or perhaps display PNGs at a higher definition)?
我正在尝试用 Pygame 制作国际象棋开局训练器。从图形上看,它非常简单;它像幻灯片一样工作,我一次只将一个图像传送到屏幕上,当我按下 return 键时更新。我正在使用 chess.svg 生成当前游戏状态的 SVG。无法通过 pygame 本机使用 SVG 意味着我一直在将 SVG 转换为 PNG。
在我的电脑上看PNG,很清楚。
但是pygame显示图像时,图像非常模糊。
理想情况下,我希望 pygame 显示 SVG,这样我就不必担心分辨率了。我在 pygame 和 SVG 上找到的所有内容都是 12 年前的 link。 2018年,贴出了一个回答,说原来的方法已经不管用了。但是,现在2021年,2018年给出的方法也不管用了;我试过了,一条评论也证实了这一点。
如果无法使用 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 中重写它
chess.svg.board 有一个 size 关键字参数:
size – The size of the image in pixels (e.g., 400 for a 400 by 400 board), or None (the default) for no size limit.
例如
boardsvg = chess.svg.board(board=board, size=1024)
将此设置为您的输出大小应该可以解决模糊问题。
我正在尝试用 Pygame 制作国际象棋开局训练器。从图形上看,它非常简单;它像幻灯片一样工作,我一次只将一个图像传送到屏幕上,当我按下 return 键时更新。我正在使用 chess.svg 生成当前游戏状态的 SVG。无法通过 pygame 本机使用 SVG 意味着我一直在将 SVG 转换为 PNG。
在我的电脑上看PNG,很清楚。
但是pygame显示图像时,图像非常模糊。
理想情况下,我希望 pygame 显示 SVG,这样我就不必担心分辨率了。我在 pygame 和 SVG 上找到的所有内容都是 12 年前的 link。 2018年,贴出了一个回答,说原来的方法已经不管用了。但是,现在2021年,2018年给出的方法也不管用了;我试过了,一条评论也证实了这一点。
如果无法使用 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.
chess.svg.board 有一个 size 关键字参数:
size – The size of the image in pixels (e.g., 400 for a 400 by 400 board), or None (the default) for no size limit.
例如
boardsvg = chess.svg.board(board=board, size=1024)
将此设置为您的输出大小应该可以解决模糊问题。