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

Pygame中缩放画布图像至28×28后保存为空的问题求助

问题解决:Pygame缩放保存28×28图片全黑的问题

核心错误点

  1. Blit顺序与位置完全错误
    你写的predict_img.blit(new_res_canvas, (28, 28))搞反了操作逻辑:blit的规则是目标表面.blit(源表面, 绘制位置),你应该把缩放后的图画到new_res_canvas上,而不是反过来。而且位置(28,28)已经超出了28×28的表面范围,等于完全没画上去,new_res_canvas还是初始的黑色,所以保存出来全黑。

  2. 多余的文件读写操作
    先保存画布到文件再重新加载完全没必要,直接对内存中的canvas表面做缩放操作就行,既高效又避免文件IO可能带来的问题。

修正后的代码

直接简化函数,去掉冗余步骤:

def predict_screen():
    # 直接对canvas进行平滑缩放
    scaled_digit = pygame.transform.smoothscale(canvas, (28, 28))
    # 保存缩放后的图片
    pygame.image.save(scaled_digit, 'digit.png')
    # 如果需要保留大尺寸图片,加上下面这句
    pygame.image.save(canvas, 'digit_large.png')

额外说明

  • 不需要用convert_alpha():你的画布是不透明的黑色背景,直接缩放原表面即可,带alpha的转换反而可能影响最终图片的颜色表现。
  • 如果一定要用new_res_canvas中转(比如后续还要做其他处理),可以改成这样:
def predict_screen():
    scaled_digit = pygame.transform.smoothscale(canvas, (28, 28))
    # 先清空new_res_canvas(可选,因为缩放后的图会覆盖整个表面)
    new_res_canvas.fill(black)
    # 把缩放后的图绘制到new_res_canvas的左上角
    new_res_canvas.blit(scaled_digit, (0, 0))
    pygame.image.save(new_res_canvas, 'digit.png')

内容的提问来源于stack exchange,提问作者CelCoding

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:52:40