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

将黑白PNG图像转为二进制数组(黑1白0)的代码报错求助

解决黑白PNG转二进制数组的代码报错问题

嘿,我一眼就揪出问题所在啦!你碰到的argument 2 to map() must support iteration错误,核心原因是给map()传了整个Image对象img,但map()需要的是可迭代的像素数据集合,不是Image实例本身。咱们一步步来修正:

错误原因拆解

  • 你已经通过pixels = img.getdata()获取了图像的像素迭代器,但在map(threshold, img)里误用了img而非pixels,导致map()无法迭代处理像素。
  • 还有个小语法坑:导入语句挤在了同一行,Python会直接报错,得拆成两行写。

修正后的完整代码

from PIL import Image
from resizeimage import resizeimage

def threshold(col):
    # 黑白图RGB通道值一致,sum(col)等价于3*col[0],判断是否偏黑(黑色对应1)
    s = sum(col)
    # 阈值设为255*3//2,即像素亮度低于一半时判定为黑色(1)
    return int(s > 255 * 3 // 2)

if __name__ == "__main__":
    img = Image.open("filename.png")
    # 计算宽高比,按宽度100等比例缩放图像
    ratio = float(img.size[1]) / img.size[0]
    img = resizeimage.resize_cover(img, [100, int(ratio * 100)])
    pixels = img.getdata()
    # 这里把img换成pixels,用map处理每个像素
    binary = list(map(threshold, pixels))
    # 将一维像素数组转为二维,对应图像的行列结构
    array2d = [binary[i * img.size[0] : (i+1) * img.size[0]] for i in range(img.size[1])]
    # 打印每行的二进制字符串
    print('\n'.join(''.join(map(str, line)) for line in array2d))

额外优化建议

如果你的图像已经是灰度图,可以把threshold函数简化,直接取单个通道值,效率更高:

def threshold(col):
    # 灰度图像素为单值,直接判断亮度即可
    return int(col[0] > 127)  # 127是255的一半,和原阈值逻辑一致

这样修改后,代码就能正常运行,把黑白PNG转换成你需要的二进制数组啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:51:05