• Python中Tkinter模块的Canvas控件绘制jpg图片到指定区域


      准备在Python的Tkinter模块中用Canvas绘制如下形式的工艺卡片(图片来自参考文献5,原图来自参考文献4),但是在绘制图形时遇到两个问题,特此记录如下:
    在这里插入图片描述

    jpg图片无法读取

      Canvas绘制图片支持bitmap和image两种格式,其中image必须是tkinter模块的BitmapImage类或PhotoImage类的实例变量,而PhotoImage类不支持jpg格式图片。
    在这里插入图片描述
      百度tkinter绘制jpg图片,大部分搜索结果中给出的建议都是使用PIL包中的 Image类和ImageTk类中转一下,具体介绍请见参考文献6,程序代码列出如下:

    from PIL import Image, ImageTk
    
    img = Image.open("./images/part1.jpg")
    photo = ImageTk.PhotoImage(img)
    cv.create_image(startX,startY+51,anchor = tk.NW,image=photo)
    
    • 1
    • 2
    • 3
    • 4
    • 5

      如果本机没有安装PIL 包,使用pip install PIL安装包时会提示如下错误,关于该错误的说明请见参考文献2,将安装命令改为pip install Pillow即可正常安装。

    ERROR: Could not find a version that satisfies the requirement PIL (from versions: none)
    ERROR: No matching distribution found for PIL
    WARNING: There was an error checking the latest version of pip.
    
    • 1
    • 2
    • 3
    无法将图片绘制到指定区域

      图片正常加载后,运行上面的绘图函数绘图,得到如下结果,可以看到图片已经超出的左侧显示区域,占据了部分右侧显示区域。
    在这里插入图片描述
      还是回到Canvas绘图函数定义,绘图函数中仅支持指定绘图的左上角坐标,并没有指定绘图区域的参数,尝试在函数中增加width和height属性并赋值,运行程序时会直接报错。
    在这里插入图片描述
      百度tkinter canvas 绘制图形到指定区域,也没有找到能参考的文章,不过在参考文献3中的示例程序中有调用Image类的resize函数重新设置图片大小的代码。既然没有找到类似C#GDI+和JavaScript绘图函数那样可以指定绘图区域的配置,那死马先当活马医,先将图片尺寸重新设置为工艺卡片中绘图区域的大小,然后再调用Canvas绘图函数绘图,代码及程序效果如下所示。勉强能看,但只是凑合能用,后续还会继续学习Canvas绘图方法,看是否有更好的解决方式。

    img = Image.open("./images/part1.jpg").resize((399, 222), Image.ANTIALIAS)
    photo = ImageTk.PhotoImage(img)
    cv.create_image(startX,startY+51,anchor = tk.NW,image=photo)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    参考文献:
    [1]http://c.biancheng.net/tkinter/canvas-widget.html
    [2]https://blog.csdn.net/username666/article/details/113598726
    [3]https://vimsky.com/examples/detail/python-method-ImageTk.PhotoImage.html
    [4]https://baike.baidu.com/item/%E5%B7%A5%E8%89%BA%E5%8D%A1/8940434?fr=aladdin
    [5]https://blog.csdn.net/gc_2299/article/details/110292808
    [6]https://www.cnblogs.com/Mrzyz/p/16146182.html

  • 相关阅读:
    GIT简单使用
    Docker搭建nacos2.x集群+nginx代理
    pdf格式转成jpg图片,pdf格式如何转jpg
    StopWatch使用注意S
    基于C++的关键字检索系统
    51Sim核心参编!《中国智能网联汽车自动驾驶仿真测试白皮书》发布(附资源)
    vue2源码学习(3)-响应式原理(二)
    LeetCode每日一题(2090. K Radius Subarray Averages)
    【Java 进阶篇】CSS 属性
    vulnhub Corrision2渗透
  • 原文地址:https://blog.csdn.net/gc_2299/article/details/126576207