我正在使用 python 2.7,目前我正在 pyagme 中为我的学校作业开发一个基本游戏。我从谷歌下载了一张图片,它有背景颜色,我知道它是 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 造成的。 format 是一种压缩格式。
压缩不是无损的。这意味着武器周围的颜色并不完全是白色(255、255、255)。对于人眼来说,颜色看起来是白色,但实际上颜色 channel 的值小于 255,但接近 255。
您可以尝试手动更正此问题。确保图像格式具有 Alpha channel pygame.Surface.convert_alpha()
。识别所有具有高于特定阈值(例如 230)的红绿和蓝色 channel 的像素。将这些像素的颜色 channel 和 Alpha channel 更改为 (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)来避免此类问题。或PNG .
使用这种格式,可以无损地存储像素。
您可以尝试对图像进行“photoshop”处理。手动更改武器周围的像素并以不同的格式存储图像。
关于python - 如何让屏幕忽略某些图像的背景颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55648488/