2014-01-12 3 views
2

Для некоторых (но не всех!) Изображений копирование поверхности с использованием surface.copy() теряет прозрачность. Значит, у меня есть два вопроса?Использование Surface.copy() иногда пропускает прозрачность

  1. Почему копия теряет прозрачность?docs звук все о новой поверхности должно быть одинаковым, но это, очевидно, не происходит.

  2. Почему это происходит с некоторыми изображениями, а не с другими?

Вот пример «плохие» изображения - при копировании, прозрачность теряется

Bad image.

Вот пример «хорошо» изображения - при копировании, прозрачность является не утерян.

Good image.

А вот код, который вы можете запустить, чтобы увидеть разницу:

import pygame 

def test(): 
    screen = pygame.display.set_mode((320, 240)) 
    bad_original = pygame.image.load('bad-image.gif') 
    bad_copied = bad_original.copy() 

    good_original = pygame.image.load('good-image.gif') 
    good_copied = good_original.copy() 

    while True: 
     for event in pygame.event.get(): 
      if (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE or 
       event.type == pygame.QUIT): 
       pygame.quit() 

     screen.fill((150, 150, 150)) 

     screen.blit(bad_original, (0,0)) 
     screen.blit(bad_copied, (100, 0)) 
     screen.blit(good_original, (0,100)) 
     screen.blit(good_copied, (100, 100)) 
     pygame.display.flip() 

if __name__ == '__main__': 
    test() 

И черт, для завершения, вот что скриншот выполнения кода выглядит. Result of running the above code.

Пожалуйста, обратите внимание, что я не ищу обходные пути; Я просто хочу знать, что я не понимаю о surface.copy, или что-то, что, по вашему мнению, я не понимаю о работе с поверхностями Pygame.

Я использую Python 3.3 и Pygame 1.9.2pre на компьютере с Windows 7.

+0

Кажется, что это ошибка в pygame. –

+0

Huh. Хорошо знать. Является ли это известной ошибкой или я должен заполнить отчет об ошибке? –

ответ

0

Вы должны использовать .convert_alpha()

Try:

pygame.image.load('my_image.gif').convert_alpha() 

См.: http://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert_alpha

«Создает новую копию поверхности с требуемым форматом пикселя новой поверхности будет в формате, подходящем для быстрого blitting для данного формата с пикселем альфа. Если поверхность не указана, новая поверхность будет оптимизирована для блиты на текущем дисплее.

В отличие от метода Surface.convert(), формат пикселей для нового изображения не будет точно таким же, как запрошенный источник, но он будет оптимизирован для быстрого альфа-биения в пункт назначения ».

В pygame в любое время, когда вы загружаете и рисуете или создаете поверхность, с целью ее отображения вы должны .convert(), если у нее нет прозрачности или .convert_alpha(), если она имеет прозрачность. Это дает как большое ускорение И решает загадку: «Почему моя прозрачность делает это?».

Смежные вопросы