Pygame中缩放画布图像至28×28后保存为空的问题求助
问题解决:Pygame缩放保存28×28图片全黑的问题
核心错误点
Blit顺序与位置完全错误
你写的predict_img.blit(new_res_canvas, (28, 28))搞反了操作逻辑:blit的规则是目标表面.blit(源表面, 绘制位置),你应该把缩放后的图画到new_res_canvas上,而不是反过来。而且位置(28,28)已经超出了28×28的表面范围,等于完全没画上去,new_res_canvas还是初始的黑色,所以保存出来全黑。多余的文件读写操作
先保存画布到文件再重新加载完全没必要,直接对内存中的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
相关产品推荐
相关产品推荐

