Używam pygame (1.9.0rc3, choć tak samo dzieje się w 1.8.1), aby utworzyć mapę cieplną. Aby zbudować mapę cieplną, używam małego, 24-bitowy 11x11px dot PNG z białym tłem i bardzo niskiej przezroczystości szare kropki, który zatrzymuje się dokładnie na krawędziach:Pygame i blitting: biały na białym = szary?
Dot image http://img442.imageshack.us/img442/465/dot.png
obszar wokół kropki jest idealnie biały, #ffffff, tak jak być powinien. Jednak gdy używam pygame do wielokrotnego blitowania obrazu na nową powierzchnię za pomocą BLEND_MULT, pojawia się szary kwadrat, tak jakby tło kropki nie było idealnie białe, co nie ma sensu.
następujący kod, plus zamówione obrazy, można odtworzyć to:
import os
import numpy
import pygame
os.environ['SDL_VIDEODRIVER'] = 'dummy'
pygame.display.init()
pygame.display.set_mode((1,1), 0, 32)
dot_image = pygame.image.load('dot.png').convert_alpha()
surf = pygame.Surface((100, 100), 0, 32)
surf.fill((255, 255, 255))
surf = surf.convert_alpha()
for i in range(50):
surf.blit(dot_image, (20, 40), None, pygame.BLEND_MULT)
for i in range(100):
surf.blit(dot_image, (60, 40), None, pygame.BLEND_MULT)
pygame.image.save(surf, 'result.png')
Po uruchomieniu kodu, otrzymasz następujący obraz:
Resulting image after blending http://img263.imageshack.us/img263/4568/result.png
Czy istnieje powód tego dzieje się? Jak mogę obejść to?
Niecałe dwie minuty temu zdałem sobie sprawę z tego samego (że jest "wyłączony przez jednego"), ale nie mogłem znaleźć miejsca, w którym znaleziono źródło obliczeń. Ponieważ ten błąd robi ogromną różnicę, gdy pomnożymy 255 * 255 (potrzebuję go w mapach termicznych), w jaki sposób mam zamiar zastosować opcję nr 3? Wcale nie jestem zaznajomiony z C, więc gdybyś mógł wskazać mi właściwy kierunek implementacji, prawdopodobnie uratowałbyś moje zdrowie psychiczne (lub to, co zostało w tym momencie). –
Najlepszy kompromis pomiędzy wydajnością i prostotą prawdopodobnie zapewniłby implementację nr 2 poprzez nałożenie ADD-bliting na powierzchnię all- (1,1,1) na wynik. Jeśli jednak chcesz zagłębić się w rozszerzenia C, możesz zacząć od spojrzenia na cython, który jest C-Python-Hybrid: http://www.cython.org. Zauważ, że ja sam nie mam dużego doświadczenia w tej dziedzinie. – balpha
Ponadto, jeśli jest to możliwe w twoim przypadku, możesz po prostu zmienić i ponownie skompilować pygame. To jednak utrudniłoby dystrybucję twojego programu, ponieważ skończyłbyś z niestandardową wersją pygame. – balpha