为什么图像会像素化? pygame

why does image become pixelated? pygame

我很想知道当我将鼠标悬停在马铃薯上时,它会如何以及为什么会变得越来越像素化,直到达到 16x16 像素的马铃薯图像?我自己真的不知道从哪里开始解释。

main.py

import pygame
import math
import random
from potato import Potato
knife = pygame.image.load("knife.png")
knife = pygame.transform.rotate(knife, 270)
knife = pygame.transform.scale(knife, (200, 200))
potato = pygame.image.load("potato.png")
potato = pygame.transform.scale(potato, (200, 160))
WIDTH, HEIGHT = 800, 500
window = pygame.display.set_mode((WIDTH, HEIGHT))


def main():
    done = False
    potatoThing = Potato(knife, potato, WIDTH/2-100, HEIGHT/2 - 80)
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
        mousex, mousey = pygame.mouse.get_pos()
        window.fill((195, 245, 98))
        potatoThing.draw(window)
        potatoThing.update(mousex, mousey)
        pygame.display.update()
    pygame.quit()

main()

potato.py

import pygame
import math
import random
from pygame.math import Vector2 as vect

def distanceBecauseMeep(min, max, value):
    if value < min:
        return min
    elif value > max:
        return max
    else:
        return value

class Potato:
    def __init__(self, sprite1, sprite2, x, y):
        self.knifeSprite = sprite1
        self.potatoSprite = sprite2
        self.pos = vect(x, y)
        self.isHoveringOver = False
        self.sizeOfPotato = (200, 160)
        self.sizeOfKnife = (200, 200)
    def draw(self, win):
        if self.isHoveringOver:

            self.sizeOfPotato = (220, 180)
            self.sizeOfKnife = (220, 220)

        else:

            self.sizeOfPotato = (200, 160)
            self.sizeOfKnife = (200, 200)

        self.potatoSprite = pygame.transform.scale(self.potatoSprite, self.sizeOfPotato)
        self.knifeSprite = pygame.transform.scale(self.knifeSprite, self.sizeOfKnife)

        win.blit(self.potatoSprite, (self.pos))
        win.blit(self.knifeSprite, (self.pos))
    def update(self, xPos, yPos):
        self.x = xPos
        self.y = yPos

        self.CosX = distanceBecauseMeep(self.pos.x, self.pos.x + self.sizeOfPotato[0], self.x)
        self.CosY = distanceBecauseMeep(self.pos.y, self.pos.y + self.sizeOfPotato[1], self.y)

        self.distance = math.sqrt((self.CosX - self.x)**2 + (self.CosY - self.y)**2)
        if self.distance <= 0.0:
            self.isHoveringOver = True
        else:
            self.isHoveringOver = False

这里有一些图片可以帮助说明我的观点和困惑

首次启动程序时:

当你将鼠标悬停在上面几次时

它可能与 potato.py 中的元组有关,但我不太确定。我真的很困惑,甚至不知道这是图像像素化的可能性。

我试过了

pygame.transform.smoothscale

但所做的只是模糊图像而不是像素化图像

您重复将同一张图片缩放到不同的尺寸并用它替换原始图片。每次都是有损操作;相反,保留 pristine 版本并将其缩放到每个所需的大小。 (只有两种尺寸,您可以提前为每种尺寸执行此操作,而不是每帧执行一次。)