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)

  如果本机没有安装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.
无法将图片绘制到指定区域

  图片正常加载后,运行上面的绘图函数绘图,得到如下结果,可以看到图片已经超出的左侧显示区域,占据了部分右侧显示区域。
在这里插入图片描述
  还是回到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]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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值