如何让屏幕忽略某些图像的背景颜色?
How do I make the screen ignore the background color of some image?
我正在使用 python 2.7,目前我正在为我的学校作业使用 pyagme 开发一个基本游戏。我从 google 下载了一张图片,它有背景颜色,我知道它是 RGB。我记得有一种方法可以让屏幕忽略图片的这个RGB(图片会出现没有背景色)但是我不记得了。
import pygame
WINDOW_WIDTH = 1200
WINDOW_LENGTH = 675
IMAGE = r'C:\Users\omero\Downloads\BattleField.jpg'
PISTOL_IMAGE = r'C:\Users\omero\Downloads\will.jpg'
RED = (255,0,0)
BLACK = (0,0,0)
WHITE = (255,255,255)
pygame.init()
size = (WINDOW_WIDTH, WINDOW_LENGTH)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Game")
clock = pygame.time.Clock()
img = pygame.image.load(IMAGE)
screen.blit(img, (0,0))
pygame.display.flip()
pistol_img = pygame.image.load(PISTOL_IMAGE)
colorkey = pistol_img.get_at((0,0))
screen.blit(pistol_img,(50,50))
pygame.display.flip()
finish = False
while not finish:
for event in pygame.event.get():
if event.type == pygame.QUIT:
finish = True
pygame.quit()
当我 运行 上面我用 pistol_img 获得背景颜色时,如何让屏幕忽略它而不编辑图像?
您在图片中看到的白色伪影是由于 JPG 格式是压缩格式造成的。
压缩不是无损的。这意味着武器周围的颜色并不完全是白色(255、255、255)。颜色在人眼看来是白色的,但实际上颜色通道的值小于 255,但接近 255。
您可以尝试手动更正此问题。通过 pygame.Surface.convert_alpha()
确保图像格式具有 alpha 通道。识别所有具有高于特定阈值(例如 230)的红绿蓝颜色通道的像素。将这些像素的颜色通道和 Alpha 通道更改为 (0, 0, 0, 0):
img = pygame.image.load(IMAGE).convert_alpha()
threshold = 230
for x in range(img.get_width()):
for y in range(img.get_height()):
color = img.get_at((x, y))
if color.r > threshold and color.g > threshold and color.b > threshold:
img.set_at((x, y), (0, 0, 0, 0))
当然,您有更改不想更改的像素的危险。如果武器有一些非常“亮”的区域,那么这些区域也会变得透明。
请注意,可以通过使用不同的图像格式来避免此类问题,例如 BMP or PNG。
使用这种格式,像素可以无损存储。
您可以尝试“照相馆”图像。手动更改武器周围的像素并以不同格式存储图像。
我正在使用 python 2.7,目前我正在为我的学校作业使用 pyagme 开发一个基本游戏。我从 google 下载了一张图片,它有背景颜色,我知道它是 RGB。我记得有一种方法可以让屏幕忽略图片的这个RGB(图片会出现没有背景色)但是我不记得了。
import pygame
WINDOW_WIDTH = 1200
WINDOW_LENGTH = 675
IMAGE = r'C:\Users\omero\Downloads\BattleField.jpg'
PISTOL_IMAGE = r'C:\Users\omero\Downloads\will.jpg'
RED = (255,0,0)
BLACK = (0,0,0)
WHITE = (255,255,255)
pygame.init()
size = (WINDOW_WIDTH, WINDOW_LENGTH)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Game")
clock = pygame.time.Clock()
img = pygame.image.load(IMAGE)
screen.blit(img, (0,0))
pygame.display.flip()
pistol_img = pygame.image.load(PISTOL_IMAGE)
colorkey = pistol_img.get_at((0,0))
screen.blit(pistol_img,(50,50))
pygame.display.flip()
finish = False
while not finish:
for event in pygame.event.get():
if event.type == pygame.QUIT:
finish = True
pygame.quit()
当我 运行 上面我用 pistol_img 获得背景颜色时,如何让屏幕忽略它而不编辑图像?
您在图片中看到的白色伪影是由于 JPG 格式是压缩格式造成的。
压缩不是无损的。这意味着武器周围的颜色并不完全是白色(255、255、255)。颜色在人眼看来是白色的,但实际上颜色通道的值小于 255,但接近 255。
您可以尝试手动更正此问题。通过 pygame.Surface.convert_alpha()
确保图像格式具有 alpha 通道。识别所有具有高于特定阈值(例如 230)的红绿蓝颜色通道的像素。将这些像素的颜色通道和 Alpha 通道更改为 (0, 0, 0, 0):
img = pygame.image.load(IMAGE).convert_alpha()
threshold = 230
for x in range(img.get_width()):
for y in range(img.get_height()):
color = img.get_at((x, y))
if color.r > threshold and color.g > threshold and color.b > threshold:
img.set_at((x, y), (0, 0, 0, 0))
当然,您有更改不想更改的像素的危险。如果武器有一些非常“亮”的区域,那么这些区域也会变得透明。
请注意,可以通过使用不同的图像格式来避免此类问题,例如 BMP or PNG。
使用这种格式,像素可以无损存储。
您可以尝试“照相馆”图像。手动更改武器周围的像素并以不同格式存储图像。