如何获取pygame Surface排除透明色键像素后的平均颜色值
问题原因
pygame.transform.average_color本身不直接响应set_colorkey标记的透明规则:set_colorkey仅指定表面渲染时要忽略的颜色,不会修改表面内的原始像素数据,所以白色像素依然会被纳入平均值计算- 该方法返回的alpha值为0,是因为对于设置了colorkey的表面,计算时会将所有匹配colorkey的像素视为alpha=0、其余像素视为alpha=255参与加权计算,你的图片大部分区域为匹配colorkey的白色,最终平均alpha接近0,RGB值也因为被大量白色像素平均而偏浅
解决方法
你可以先将colorkey对应的颜色转为实际的alpha通道透明像素,再计算平均颜色,此时average_color会自动将alpha=0的像素按权重0计入,相当于跳过这些像素,得到正确结果:
import pygame pygame.init() # 加载原图并设置colorkey image = pygame.image.load('enemy.png') colorkey = (255, 255, 255) image.set_colorkey(colorkey) # 创建同等尺寸的带alpha通道的空表面 alpha_surf = pygame.Surface(image.get_size(), pygame.SRCALPHA) # 将原图画到空表面,colorkey对应的白色会自动转为alpha=0的透明像素 alpha_surf.blit(image, (0, 0)) # 计算平均颜色,得到的前三个通道就是非透明区域的平均色 color = pygame.transform.average_color(alpha_surf, alpha_surf.get_rect()) # 取RGB三个值即可,此时返回的color前三位为(38, 43, 68),符合你的预期
如果是小尺寸图片,也可以直接遍历像素统计计算:
image = pygame.image.load('enemy.png') colorkey = (255, 255, 255) w, h = image.get_size() sum_r = sum_g = sum_b = count = 0 for x in range(w): for y in range(h): pixel = image.get_at((x, y))[:3] if pixel != colorkey: sum_r += pixel[0] sum_g += pixel[1] sum_b += pixel[2] count += 1 avg_color = (sum_r//count, sum_g//count, sum_b//count)
内容的提问来源于stack exchange,提问作者Kesslwovv
相关产品推荐
相关产品推荐

