【问题标题】:How can I use SVGs with pygame (or perhaps display PNGs at a higher definition)?如何将 SVG 与 pygame 一起使用(或者以更高的分辨率显示 PNG)?
【发布时间】:2021-07-08 17:58:54
【问题描述】:

我正在尝试用 Pygame 做一个国际象棋开场训练师。从图形上看,它非常简单;它就像幻灯片一样工作,我一次只在屏幕上显示一个图像,当我按下返回键时它会更新。我正在使用 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()

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

干杯。

【问题讨论】:

  • 相似问题有新答案(从 2020 年开始)。因此那里的信息没有过时。见SVG rendering in a PyGame application。
  • PNG 的分辨率是多少?你把它缩小吗?当您缩小图像时,它可能会变得模糊。
  • 生成的原始 svg 文件的大小是多少以及看起来模糊可能是图像缩放和重新缩放的结果,因为您首先将其重新缩放 3 倍,然后重新缩放它的分辨率 (640, 640)

标签: python svg pygame chess python-chess


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 2021-01-31
    • 2013-02-06
    • 2013-11-26
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多