首页 > 编程问答 >ipywidgets 容器小部件中的 PIL 图像

ipywidgets 容器小部件中的 PIL 图像

时间:2024-07-28 16:48:40浏览次数:14  
标签:python image python-imaging-library jupyter-lab ipywidgets

我有一些来自某个图书馆的 PIL 图像,并尝试了解它发生了什么。为此,我计算一些值,调用库并查找图片。我对计算值感兴趣。我使用带有一些滑块的 jupyter 笔记本与库进行交互。这是我的代码的一个非常简短的示例:

    from PIL import Image, ImageDraw
    import ipywidgets
    
    def explore_call(width, height, foo, bar):
        # some very important computation
        essential_value_one = width - foo
        essential_value_two = height - bar
        # output interim results
        print(f"{essential_value_one=}, {essential_value_two=}")
        # mimic PIL image return from a library
        image = Image.new(mode="RGB", size=(width, height), color="black")  
        draw = ImageDraw.Draw(image)
        draw.rectangle(xy=(foo, bar, essential_value_one, essential_value_two))
    
        return image
    
    ipywidgets.interact(explore_call,
                        width=ipywidgets.IntSlider(min=10, max=200, step=1, value=100),
                        height=ipywidgets.IntSlider(min=10, max=200, step=1, value=100),
                        foo=ipywidgets.IntSlider(min=0, max=20, step=1, value=10),
                        bar=ipywidgets.IntSlider(min=0, max=20, step=1, value=10),
                       )

这还不错。 Jupyter 笔记本显示返回的图像,但我希望将其放入 ipywidgets 容器小部件中,用其他小部件替换打印,进行一些基本布局。我找到了 ipywidgets.Image ,但无法正确实例化它(我尝试将PIL图像保存到 io.StringIO 缓冲区中,然后将其值传递到 ipywidgets.Image 中,但没有成功)。那么,如何将 PIL 图像包装在小部件中呢?


走在正确的轨道上,可以使用 io.StringIO 将 PIL 图像嵌入到 ipywidgets.Image 中。只需确保使用 .getvalue() 方法从 io.BytesIO 对象中提取字节数据即可。

以下是如何修改代码以将 PIL 图像显示在 ipywidgets.Image 窗口小部件中的方法:

from PIL import Image, ImageDraw
import ipywidgets
from io import BytesIO

def explore_call(width, height, foo, bar):
    # 一些非常重要的计算
    essential_value_one = width - foo
    essential_value_two = height - bar

    # 将中间结果输出到小部件
    output_widget.clear_output()
    with output_widget:
        print(f"{essential_value_one=}, {essential_value_two=}")

    # 模拟从库返回的 PIL 图像
    image = Image.new(mode="RGB", size=(width, height), color="black")  
    draw = ImageDraw.Draw(image)
    draw.rectangle(xy=(foo, bar, essential_value_one, essential_value_two))

    # 将 PIL 图像转换为字节流
    buf = BytesIO()
    image.save(buf, format='PNG')

    # 创建 ipywidgets.Image 并显示
    image_widget.value = buf.getvalue()

# 创建小部件
image_widget = ipywidgets.Image(format='png')
output_widget = ipywidgets.Output()

# 使用 interact 函数创建交互式控件
ipywidgets.interact(
    explore_call,
    width=ipywidgets.IntSlider(min=10, max=200, step=1, value=100),
    height=ipywidgets.IntSlider(min=10, max=200, step=1, value=100),
    foo=ipywidgets.IntSlider(min=0, max=20, step=1, value=10),
    bar=ipywidgets.IntSlider(min=0, max=20, step=1, value=10),
)

# 显示图像和小部件
ipywidgets.VBox([image_widget, output_widget])

在此代码中:

  1. 我们创建了两个小部件: image_widget 用于显示图像, output_widget 用于显示打印语句。
  2. explore_call 函数中,我们将打印语句重定向到 output_widget
  3. 我们使用 BytesIO 将 PIL 图像保存为 PNG 格式的字节流。
  4. 使用 .getvalue() BytesIO 对象中提取字节数据,并将其分配给 image_widget.value 以显示图像。
  5. 最后,我们使用 ipywidgets.VBox 将图像和小部件垂直排列。

现在,的 Jupyter Notebook 将在交互式滑块下方显示图像和打印输出。

标签:python,image,python-imaging-library,jupyter-lab,ipywidgets
From: 78802920

相关文章

  • 如何在 Python 中创建正确显示素数的代码?
    素数是只能被自身和1整除的数。例如,数字5是素数,因为它只能被1整除和5.然而,数字6不是质数,因为它可以被整除通过2和3。编写一个名为is_prime的布尔函数,它接受一个整数作为参数如果参数是素数则返回true,否则返回false。使用程序中提示用户输入数字然后输......
  • 在 MySQL Workbench 中升级 python
    MySQLWorkbench中的python版本不断受到安全标记,因为它不是最新版本。我的电脑上有最新版本,但在MySQL文件中它似乎是旧版本。我怎样才能更新,使其与我的电脑版本相同?尝试看看是否可以更新python,但没有运气很遗憾,你无法直接升级MySQLWorkbench内置的Python版本......
  • Python科研武器库 - 文件/路径操作 - 判断路径是否存在
    使用场景:在科研中,用Python处理数据的一个核心目的是批量处理,批量处理节省了研究者大量的时间和精力,不然,还不如手动一个个地去处理。批量处理通常要求数据整体较为规整,能够进行统一的处理操作,但实际数据中总存在一些不规则的样本,甚至有些样本的命名都存在不规范,例如,整个数据集......
  • python刷题常用模板
    #=====================================素数筛Begin=====================================#MAXN=1000prime=[]isprime=[True]*(MAXN+1)defeuler():isprime[1]=Falseforiinrange(2,MAXN+1):ifisprime[i]:prime.append(i)......
  • [附开题]flask框架的全国汽车销售信息查询系统的设计与实现7m1w0(python+源码)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着中国汽车市场的蓬勃发展,汽车品牌的日益丰富以及消费者购车需求的多样化,汽车销售信息的准确性与时效性成为了市场关注的焦点。传统汽车......
  • [附开题]flask框架的校园停车场管理系统的设计与实现61m0e(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的普及和校园规模的不断扩大,校园内车辆数量急剧增加,停车难问题日益凸显。传统的人工停车场管理模式已难以满足现代校园对高效......
  • [附开题]flask框架的校园学生管理系统s8h32(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着教育技术的不断进步和高校规模的不断扩大,传统的学生管理方式已难以满足现代校园管理的需求。学生数量激增、课程种类繁多、选课流程复......
  • [附开题]flask框架的校园疫情管理系统92tl0(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着新冠疫情的持续影响,校园作为人群密集、流动性大的场所,其疫情防控工作显得尤为重要。传统的手工记录和口头报告方式已难以满足当前复杂......
  • 如何从 python 脚本将事件和上下文传递到 AWS lambda?
    我正在创建一个cli应用程序,我想用它来调用我的AWSlambda函数:@click.group(context_settings={"help_option_names":["-h","--help"]},invoke_without_command=True)@click.version_option(version=__version__,prog_name="experiment")def......
  • 有没有办法检查是否有人提到@youtubechannelname并使用youtube数据api让Python脚本回
    标题解释了大部分内容。我的问题是,尽管到处搜索,但我没有找到任何有用的解决方案。AI和ChatGPT都无法对此提供帮助。不幸的是,YouTube数据API不提供直接监控频道提及或自动回复评论的功能。YouTube数据API主要用于检索和管理YouTube上的视频、评论和其他资源,而......