如何将tf.io.encode_jpeg生成的字符串Tensor转为PIL Image
报错原因
tf.io.encode_jpeg 的返回值是JPEG编码后的二进制字节串,不是可直接传入Image.fromarray()的RGB像素数组。调用.numpy()拿到的是bytes类型对象,不存在数组接口属性,就会触发你看到的AttributeError。
正确转换方式
两种常用方案,根据你的流程选就行:
方案1:直接从字节流加载(代码更简洁,适合不需要额外处理张量的场景)
用BytesIO把拿到的字节串包装成类文件对象,直接传给PIL的open方法即可,不需要额外做张量解码:from io import BytesIO from PIL import Image # encoded_tensor 为tf.io.encode_jpeg返回的字符串张量 jpeg_bytes = encoded_tensor.numpy() pil_image = Image.open(BytesIO(jpeg_bytes))方案2:先解码张量再转PIL(适合后续还要做张量计算的场景)
先用TensorFlow自带的JPEG解码接口把编码后的张量转成uint8格式的像素张量,转numpy数组后再传给Image.fromarray():from PIL import Image # 解码得到形状为[高度, 宽度, 3]的uint8像素张量 decoded_img_tensor = tf.io.decode_jpeg(encoded_tensor) pil_image = Image.fromarray(decoded_img_tensor.numpy())
注意:如果调用
tf.io.encode_jpeg时自定义了色彩空间、压缩质量等参数,解码时要对应保持参数一致,避免出现色彩错乱、通道错位的问题。
内容的提问来源于stack exchange,提问作者jlin
相关产品推荐
相关产品推荐

