You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:15:04