Sto usando pygame (1.9.0rc3, anche se questo succede anche nella 1.8.1) per creare una heatmap. Per costruire la heatmap, io uso un piccolo, 24-bit 11x11px dot immagine PNG con uno sfondo bianco e un bassissimo-opacità punto grigio che si ferma esattamente ai bordi:Pygame e blitting: bianco su bianco = grigio?
Dot image http://img442.imageshack.us/img442/465/dot.png
L'area intorno al punto è bianco perfetto, #ffffff, come dovrebbe essere. Tuttavia, quando uso pygame per fondere più volte l'immagine su una nuova superficie utilizzando BLEND_MULT, appare un quadrato grigio, come se lo sfondo del punto non fosse bianco perfetto, il che non ha senso.
il seguente codice, più inclusi immagini, in grado di riprodurre questo:
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')
Quando si esegue il codice, si otterrà la seguente immagine:
Resulting image after blending http://img263.imageshack.us/img263/4568/result.png
C'è un motivo questo accade? Come posso aggirarlo?
Non solo due minuti fa ho realizzato la stessa cosa (che è "off by one"), ma non sono riuscito a trovare dove si trovasse il calcolo nella fonte pygame. Poiché questo errore fa una grande differenza quando si moltiplica 255 * 255 (ne ho bisogno per le heatmap), come faccio a implementare l'opzione # 3? Non ho alcuna familiarità con C, quindi se potessi indicarmi la giusta direzione con l'implementazione, probabilmente salverei la mia sanità mentale (o ciò che è rimasto, a questo punto). –
Il miglior compromesso tra prestazioni e semplicità sarebbe probabilmente l'implementazione n. 2 di ADD-bliting una superficie all-(1,1,1) sul risultato. Tuttavia, se vuoi scavare nelle estensioni C, potresti iniziare guardando cython, che è un C-Python-Hybrid: http://www.cython.org. Nota che io stesso non ho molta esperienza in quell'area. – balpha
Inoltre, se questo è fattibile nel tuo caso, potresti semplicemente cambiare e ricompilare pygame stesso. Tuttavia, ciò renderebbe più difficile la distribuzione del programma, poiché si finirebbe con una versione non standard di pygame. – balpha