- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有两张图片:
我想从本质上“切掉”纹理图 block 中的黑色形状,这样我最终得到的结果如下:
除了形状周围是透明的。这可能使用pygame吗?这个例子我必须在 GIMP 中创建。
此外,在实时环境中对几个 Sprite 的每一帧都执行此操作会不会太注重性能? (每秒 30 多帧)
最佳答案
我做了一个解决方案,但是无论是速度还是美观,它都不是最好的。您可以使用双 blitting 设置颜色键以实现透明度。这样,面具应该只有两种颜色:黑色和白色。请注意,您不能将此用于仅适用于 RGB 图像的每像素 alpha (RGBA) 图像。其他限制是建议纹理和蒙版图像的大小相同(如果不是,则应使用区域进行 blitting)。
一句话,一步一步:
代码示例:
#!/usr/bin/python
# -*- coding:utf8 -*-
import pygame, sys
#init pygame
pygame.init()
#init screen
screen=pygame.display.set_mode((800,600))
screen.fill((255,0,255))
#loading the images
texture=pygame.image.load("texture.jpg").convert()
texture_rect=texture.get_rect()
texture_rect.center=(200,300)
mask=pygame.Surface((texture_rect.width,texture_rect.height)) # mask should have only 2 colors: black and white
mask.fill((255,255,255))
pygame.draw.circle(mask,(0,0,0),(texture_rect.width/2,texture_rect.height/2),int(texture_rect.width*0.3))
mask_rect=mask.get_rect()
mask_rect.center=(600,300)
tmp_image=texture.copy() # make a copy of the texture to keep it unchanged for future usage
mask.set_colorkey((0,0,0)) # we want the black colored parts of the mask to be transparent
tmp_image.blit(mask,(0,0)) # blit the mask to the texture. the black parts are transparent so we see the pixels of the texture there
tmp_rect=tmp_image.get_rect()
tmp_rect.center=(400,300)
tmp_image.set_colorkey((255,255,255))
screen.blit(texture,texture_rect)
screen.blit(mask,mask_rect)
screen.blit(tmp_image,tmp_rect)
pygame.display.flip()
while 1:
event=pygame.event.wait()
if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key in [pygame.K_ESCAPE, pygame.K_q]):
sys.exit()
我建议不要使用 jpg 作为掩码,因为它是有损格式,我建议使用 bmp 或 png(bmp 更好)。请记住,它不使用 alpha,所以边缘不会被消除锯齿,所以在 2010 年这不是一个好的解决方案 :)
结果截图如下:
编辑:再次嗨,
我用 BLEND_ADD 进行了一些测试,结果很有希望。这是代码:
import pygame, sys
#init pygame
pygame.init()
#init screen
screen=pygame.display.set_mode((800,600))
screen.fill((255,0,255))
#loading the images
texture=pygame.image.load("texture.jpg").convert_alpha()
texture_rect=texture.get_rect()
texture_rect.center=(200,300)
mask=pygame.image.load("mask2.png").convert_alpha()
mask_rect=mask.get_rect()
mask_rect.center=(600,300)
textured_mask=mask.copy()
textured_rect=textured_mask.get_rect()
textured_rect.center=400,300
textured_mask.blit(texture,(0,0),None,pygame.BLEND_ADD)
screen.blit(texture,texture_rect)
screen.blit(mask,mask_rect)
screen.blit(textured_mask,textured_rect)
pygame.display.flip()
while 1:
event=pygame.event.wait()
if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key in [pygame.K_ESCAPE, pygame.K_q]):
sys.exit()
结果:
使用此解决方案,您可以获得每个像素的 alpha 纹理。请注意, mask 应该是带有 alpha channel 的图像,因此不能使用 jpg。最好使用 png。
纹理图像(texture.jpg):
mask 图像 (mask2.png):
关于python - 使用 pygame 进行主动纹理化(可能?要研究哪些概念?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3580500/
我使用 twill 在受登录表单保护的网站上导航。 from twill.commands import * go('http://www.example.com/login/index.php')
我是一名优秀的程序员,十分优秀!