我有一张64 * 64像素的树形象:
我想在运行时调整此图像的全屏模式。我试图为此编写一些代码(见下文)。执行此程序后
import pygame, sys
pygame.init()
info = pygame.display.Info()
WINDOWHEIGHT = info.current_h
WINDOWWIDTH = info.current_w
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT),pygame.FULLSCREEN)
spriteImage = pygame.image.load('Sprite-0003.png')
spriteSurf = pygame.Surface((WINDOWWIDTH,WINDOWHEIGHT))
pygame.transform.scale(spriteImage, (WINDOWWIDTH,WINDOWHEIGHT), spriteSurf)
def close():
pygame.quit()
sys.exit()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
close()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
close()
DISPLAYSURF.blit(spriteSurf, (0,0))
pygame.display.update()
我得到了这张结果图片。比较他们的颜色:
我的节目在什么时候决定改变两张图片的颜色? 我该如何解决?
答案 0 :(得分:3)
首先:看看pygame.image.load():
对于Alpha透明度,例如.png图像使用convert_alpha() 加载后的方法,使图像具有每像素透明度。
http://www.pygame.org/docs/ref/image.html#pygame.image.load
第二:Blit函数来自每个标志的文档和堆栈溢出说明:
blit(source,dest,area = None,special_flags = 0) - >矩形
可选的特殊标志用于传入1.8.0中的新内容:BLEND_ADD, 1.8.1中的BLEND_SUB,BLEND_MULT,BLEND_MIN,BLEND_MAX新增内容: 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可能还有其他特殊的blitting标志 在未来添加。
对于带有colorkey或者毯子alpha的表面,对自我的blit可能会给出与非自我blit略有不同的颜色。
基本上,ADD会添加两个源像素并将结果剪辑为255. SUB将两个像素和剪辑减去0。
MULT: result = (p1 * p2) / 256
MIN:选择每个通道的较低值(不是整个像素),因此如果pixel1为(100,10,0)
而pixel2为(0,10,100)
,则会得到(0,10,0)
MAX: Opposite of MIN (i.e. (100,10,100))
还有一个额外的混合模式,从文档中看不出来:0(或者只是将参数保留)。这种模式将"盖章"源表面进入目的地。如果源表面有一个alpha通道,这将决定" strong"每个像素为(0=no effect, 255=copy pixel, 128: result = .5*source + .5*destination).
有用效果:要使某个区域变暗,请使用混合模式0,将源/印章表面填充为黑色并将alpha设置为10:(0,0,0,10)
。
要使其变亮,请使用白色(255,255,255,10)
。
我认为你的问题来自alpha频道。
所以:
spriteImage = pygame.image.load('Sprite-0003.png').convert_alpha()
FOM:
http://www.pygame.org/docs/ref/surface.html#pygame.Surface.blit
答案 1 :(得分:0)
您的源曲面(来自图片)和您的目标曲面不使用相同的颜色键。
使用默认构造函数pygame.Surgafe
,您将得到一个没有默认colokeys的Surface。
曲面可以有许多额外的属性,如alpha平面,颜色键,源矩形剪裁。这些函数主要影响Surface如何与其他Surface进行blit。 blit例程将尝试尽可能使用硬件加速,否则他们将使用高度优化的软件blitting方法。
让我们考虑复制colokeys,或者(最好)克隆图像Surface并进行缩放。