如何让屏幕忽略某些图像的背景颜色?

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
使用这种格式,像素可以无损存储。 您可以尝试“照相馆”图像。手动更改武器周围的像素并以不同格式存储图像。