如何获得差异混合模式?

How to get the Difference blending mode?

我正在尝试为 Pygame 中的游戏制作夜间效果。所以我要在屏幕上 blit 一个黑色图像,然后将其混合模式更改为 Difference 就像在 Photoshop 中一样,以使屏幕看起来更暗。但是,我仍然不知道该怎么做,因为我还没有使用 Pygame 中的混合模式。有帮助吗?

可以通过设置 pygame.Surface.blit 的可选 special_flags 参数来更改混合模式:

blit(source, dest, area=None, special_flags=0) -> Rect
[...]
New in pygame 1.8: Optional special_flags: BLEND_ADD, BLEND_SUB, BLEND_MULT, BLEND_MIN, BLEND_MAX.
New in pygame 1.8.1: Optional special_flags: BLEND_RGBA_ADD, BLEND_RGBA_SUB, BLEND_RGBA_MULT, BLEND_RGBA_MIN, BLEND_RGBA_MAX, BLEND_RGB_ADD, BLEND_RGB_SUB, BLEND_RGB_MULT, BLEND_RGB_MIN, BLEND_RGB_MAX.
New in pygame 1.9.2: Optional special_flags: BLEND_PREMULTIPLIED
New in pygame 2.0.0: Optional special_flags: BLEND_ALPHA_SDL2 [...]

例如:

screen.blit(image, (x, y), special_flags = pygame.BLEND_RGBA_SUB)

不幸的是,Pygame 没有提供 2 个图像绝对差异的混合模式。但是可以通过

来实现

MAX(SUB(image1, imgage2), SUB(image2, image1))

例如:

image1 = pygame.image.load('image2.png')
image2 = pygame.image.load('image1.png')
temp_image = image1.copy() 
temp_image.blit(image2, (0, 0), special_flags = pygame.BLEND_RGBA_SUB)
final_image = image2.copy() 
final_image.blit(image1, (0, 0), special_flags = pygame.BLEND_RGBA_SUB)
final_image.blit(temp_image, (0, 0), special_flags = pygame.BLEND_RGBA_MAX)