Как заставить экран игнорировать цвет фона какого-либо изображения? - PullRequest
1 голос
/ 12 апреля 2019

Я использую 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()

Когда я запускаю вышеупомянутоеполучить цвет фона с пистолетом_имг, как сделать так, чтобы экран игнорировал его, не редактируя изображение?

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Артефакты, которые вы можете видеть на изображении, вызваны тем, что формат JPG является сжатым форматом.
Сжатие не без потерь.Это означает, что цвета вокруг оружия не совсем белые (255, 255, 255).Цвет кажется белым для человеческого глаза, но на самом деле цветовые каналы имеют значение меньше 255, но около 255.

Вы можете попытаться исправить это вручную.Убедитесь, что формат изображения имеет альфа-канал на pygame.Surface.convert_alpha().Определите все пиксели, которые имеют красно-зеленый и синий цветовой канал выше определенного порога (например, 230).Измените цветовые каналы и альфа-канал этих пикселей на (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 .
В этих форматах пиксель можно сохранить без потерь,Вы можете попробовать "фото магазин" изображения.Вручную измените пиксель вокруг оружия и сохраните изображение в другом формате.

1 голос
/ 12 апреля 2019
colorkey = pistol_img.get_at((0,0))
pistol_img.set_colorkey(colorkey, RLEACCEL)

Вы можете установить цветовой ключ. Фон станет прозрачным.get_at(0,0) может получить точку (0,0) на изображении.(0,0) точка часто является цветом фона.Если это не так, вы обнаружите точку фонового цвета.

Типы загруженных вами картинок, картинка очень большая и очень красочная.Таким образом, вы не можете указать все цветовые клавиши одновременно. И даже если вы установите цветовой ключ, цветовой ключ оказывает большое влияние на другие части изображения.

На pygame, цвет фона, который хочет разработчикУдалить часто означает цветную кнопку (выбранный прозрачный цвет на изображении). Подробно я научил вас этому в комментарии.

get_at ((0,0)) означает «получить цвет изображения при(0,0) в координате ".На вашей картинке она, кажется, удалена в других частях.(вокруг пистолета на снимке много белых точек.)

Если вы хотите заняться другими делами, я не знаю решения, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...