微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 pygame 中绘制更详细/更平滑的图像?

如何解决如何在 pygame 中绘制更详细/更平滑的图像?

我一直在尝试进入矢量风格的艺术世界,最近我尝试使用 .blit() 方法对矢量图像进行 blitting,但是当我对它进行 blit 时,它显示为像素化。

图片如下:

Here is the image

这是它在 pygame 中的样子

enter image description here

代码如下:

import pygame

screen = pygame.display.set_mode((500,500))
img = pygame.image.load("C:/Users/socia/Downloads/9nA8s.png")
img = pygame.transform.scale(img,(500,500))

isrunning = True
while isrunning:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            isrunning = False

    screen.blit(img,(0,0))
    pygame.display.update()

我如何绘制与第一个提到的相似的图像,以及如何在 pygame 中正确实现它。

不胜感激,谢谢!

解决方法

使用 pygame.transform.smoothscale 代替 pygame.transform.scale

img = pygame.transform.scale(img,(500,500))

img = pygame.transform.smoothscale(img,500))

虽然 pygame.transform.scale 使用 最近的 像素执行快速缩放,但 pygame.transform.smoothscale 通过像素插值将表面平滑地缩放到任何大小。


为了获得更好的结果,您可能需要切换到矢量图形格式,例如 SVG (Scalable Vector Graphics)
请参阅问题 SVG rendering in a PyGame application 的答案和以下最小示例:

import pygame
from svg import Parser,Rasterizer

def load_svg(filename,scale=None,size=None,clip_from=None,fit_to=None,foramt='RGBA'):
    svg = Parser.parse_file(filename)
    scale = min((fit_to[0] / svg.width,fit_to[1] / svg.height)
                if fit_to else ([scale if scale else 1] * 2))
    width,height = size if size else (svg.width,svg.height)
    surf_size = round(width * scale),round(height * scale)
    buffer = Rasterizer().rasterize(svg,*surf_size,scale,*(clip_from if clip_from else 0,0))
    return  pygame.image.frombuffer(buffer,surf_size,foramt)

pygame.init()
window = pygame.display.set_mode((300,300))
clock = pygame.time.Clock()

pygameSurface = load_svg('Ice.svg',fit_to = (window.get_width()*3//4,window.get_height()))

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill((127,127,127))
    window.blit(pygameSurface,pygameSurface.get_rect(center = window.get_rect().center))
    pygame.display.flip()

pygame.quit()
exit()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。