Estoy usando pygame (1.9.0rc3, aunque esto también ocurre en 1.8.1) para crear un mapa de calor. Para construir el mapa de calor, utilizo una pequeña, de 24 bits de imagen PNG 11x11px punto con un fondo blanco y un punto gris muy baja opacidad que se detiene exactamente en los bordes:Pygame y Blitting: blanco sobre blanco = gris?
Dot image http://img442.imageshack.us/img442/465/dot.png
El área alrededor del punto es blanco perfecto, #ffffff, como debería ser. Sin embargo, cuando uso pygame para dividir la imagen varias veces en una nueva superficie con BLEND_MULT, aparece un cuadrado gris, como si el fondo del punto no fuera blanco perfecto, lo cual no tiene sentido.
el siguiente código, además de las imágenes incluidas, puede reproducir este:
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')
Cuando se ejecuta el código, recibirá la siguiente imagen:
Resulting image after blending http://img263.imageshack.us/img263/4568/result.png
¿Hay una razón este sucede? ¿Cómo puedo solucionarlo?
Hace solo dos minutos no me di cuenta de lo mismo (que está "apagado en uno"), pero no pude encontrar en qué ubicación de la fuente de pygame se encontraba el cálculo. Dado que este error hace una gran diferencia al multiplicar 255 * 255 (lo necesito para los mapas de calor), ¿cómo hago para implementar la opción n. ° 3? No estoy familiarizado con C, de modo que si pudiera orientarme en la dirección correcta con la implementación, probablemente salvaría mi cordura (o lo que queda, en este punto). –
Probablemente, el mejor compromiso entre rendimiento y simplicidad sería implementar el # 2 mediante ADD-bliting de una superficie all (1,1,1) en el resultado. Sin embargo, si quieres profundizar en las extensiones C, puedes comenzar mirando cython, que es un C-Python-Hybrid: http://www.cython.org. Tenga en cuenta que yo mismo no tengo mucha experiencia en esa área. – balpha
Además, si esto es factible en su caso, puede simplemente cambiar y recompilar pygame. Sin embargo, eso dificultaría la distribución de su programa, ya que terminaría con una versión no estándar de pygame. – balpha