Как вы можете рисовать более подробные / плавные изображения в pygame?

Я пытался попасть в мир искусства в векторном стиле, и недавно я попытался скопировать векторное изображение с помощью метода .blit (), но когда я его делаю, оно получается пиксельным.

Вот изображение:

Вот изображение

и вот как это выглядит в pygame

введите описание изображения здесь

с кодом:

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.

Все было бы очень признательно, спасибо!


person Yawn    schedule 29.12.2020    source источник
comment
Это не векторное изображение, это png.   -  person Peter Wood    schedule 29.12.2020
comment
Возможно, этот вопрос актуален: stackoverflow.com/questions/4001340 / can-pygame-use-vector-art, а также ссылка на CairoPyGame в ответ.   -  person Peter Wood    schedule 29.12.2020
comment
.. см. также рендеринг SVG в приложении PyGame   -  person Rabbid76    schedule 29.12.2020


Ответы (1)


Используйте pygame.transform.smoothscale вместо _ 2_:

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

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

В то время как pygame.transform.scale выполняет быстрое масштабирование до ближайшего пикселя, pygame.transform.smoothscale плавно масштабирует поверхность до любого размера с интерполяцией пикселей.


Для еще лучшего результата вы можете переключиться на формат векторной графики, такой как SVG (масштабируемая векторная графика).
См. ответы на вопрос Визуализация SVG в PyGame приложение и следующий минимальный пример:

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()
person Rabbid76    schedule 29.12.2020
comment
Большое спасибо! - person Yawn; 29.12.2020
comment
@Yawn Спасибо. Пожалуйста. - person Rabbid76; 29.12.2020