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

PyScript+Bokeh回调处理图片时Pillow灰度转换失效问题

问题分析与解决方案

核心问题

Bokeh回调中调用PIL转换灰度图时崩溃,本质是**localStorage取出的内容未正确反序列化为PIL Image对象**,且JS与Python对象转换存在隐式问题,导致img.convert('L')执行失败。回调外能正常工作是因为该场景下对象转换逻辑完整,而回调内缺失了关键的反序列化步骤。


1. 修复localStorage存储与读取逻辑

localStorage仅支持存储字符串,因此存入Image对象时需先序列化为Base64字符串,取出时再反序列化为PIL Image:

存入Image到localStorage的代码

import base64
import io

# 假设你有一个PIL Image对象`original_img`
buffer = io.BytesIO()
original_img.save(buffer, format='PNG')
img_base64 = base64.b64encode(buffer.getvalue()).decode('utf-8')
localStorage.setItem('key', img_base64)

回调中读取并反序列化的代码

修改回调函数,添加反序列化步骤并增加异常捕获:

def callback(attr, old, new):
    try:
        div.text = f'Symbol is: {new}'
        first_item = localStorage.getItem('key')
        # 反序列化为PIL Image
        img_data = base64.b64decode(first_item)
        img = Image.open(io.BytesIO(img_data))
        
        my_image = imageToBinary(img)
        print(my_image)
        rs_img = convertBintoRS(my_image,8)
        rs_img = encodeRS(rs_img, 5, 6)
        rs_img = seperate_img(rs_img,5+6,5)
        rs_img = RStoBinary(rs_img,8)
        rs_img = binaryToImage(rs_img)
        display_image(rs_img,"reed_s")
    except Exception as e:
        console.log(f"回调错误: {str(e)}")
        print(f"回调错误: {str(e)}")

2. 优化imageToBinary函数

用numpy向量化操作替代嵌套循环,提升效率同时避免索引错误:

def imageToBinary(img):
    print('enter imageToBinary')
    img = img.convert('L')
    print('convert to greyscale')
    img_np = np.array(img, dtype=np.uint8)
    print('convert numpy')
    # 向量化操作替代循环
    img_np = np.where(img_np < 128, 0, 1).astype(np.uint8)
    print('success')
    return img_np

3. 关键原因说明

  • localStorage取出的是字符串而非PIL Image对象,直接传入imageToBinary会导致convert('L')在非Image对象上执行,触发崩溃。
  • PyScript中JS与Python对象的隐式转换存在限制,必须显式处理序列化/反序列化流程,回调外正常工作是因为该场景下对象转换逻辑完整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:20:50