为什么图像会像素化? 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 版本并将其缩放到每个所需的大小。 (只有两种尺寸,您可以提前为每种尺寸执行此操作,而不是每帧执行一次。)
我很想知道当我将鼠标悬停在马铃薯上时,它会如何以及为什么会变得越来越像素化,直到达到 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 版本并将其缩放到每个所需的大小。 (只有两种尺寸,您可以提前为每种尺寸执行此操作,而不是每帧执行一次。)