Python基于tkinter canvas实现图片裁剪功能


Posted in Python onNovember 05, 2020

实现:tkinter 画布上显示图片,按下鼠标左键并且移动,实现截图

代码如下

# -*- encoding=utf-8 -*-
import os
import tkinter as tk

from PIL import Image
from PIL import ImageTk

left_mouse_down_x = 0
left_mouse_down_y = 0
left_mouse_up_x = 0
left_mouse_up_y = 0
sole_rectangle = None


def left_mouse_down(event):
  # print('鼠标左键按下')
  global left_mouse_down_x, left_mouse_down_y
  left_mouse_down_x = event.x
  left_mouse_down_y = event.y


def left_mouse_up(event):
  # print('鼠标左键释放')
  global left_mouse_up_x, left_mouse_up_y
  left_mouse_up_x = event.x
  left_mouse_up_y = event.y
  corp_img(img_path, 'img/one_corp.png', left_mouse_down_x, left_mouse_down_y,
       left_mouse_up_x, left_mouse_up_y)


def moving_mouse(event):
  # print('鼠标左键按下并移动')
  global sole_rectangle
  global left_mouse_down_x, left_mouse_down_y
  moving_mouse_x = event.x
  moving_mouse_y = event.y
  if sole_rectangle is not None:
    canvas.delete(sole_rectangle) # 删除前一个矩形
  sole_rectangle = canvas.create_rectangle(left_mouse_down_x, left_mouse_down_y, moving_mouse_x,
                       moving_mouse_y, outline='red')


def right_mouse_down(event):
  # print('鼠标右键按下')
  pass


def right_mouse_up(event):
  # print('鼠标右键释放')
  pass


def corp_img(source_path, save_path, x_begin, y_begin, x_end, y_end):
  if x_begin < x_end:
    min_x = x_begin
    max_x = x_end
  else:
    min_x = x_end
    max_x = x_begin
  if y_begin < y_end:
    min_y = y_begin
    max_y = y_end
  else:
    min_y = y_end
    max_y = y_begin
  save_path = os.path.abspath(save_path)
  if os.path.isfile(source_path):
    corp_image = Image.open(source_path)
    region = corp_image.crop((min_x, min_y, max_x, max_y))
    region.save(save_path)
    print('裁剪完成,保存于:{}'.format(save_path))
  else:
    print('未找到文件:{}'.format(source_path))


if __name__ == '__main__':
  pass
  win = tk.Tk()
  frame = tk.Frame()
  frame.pack()
  screenwidth = win.winfo_screenwidth()
  screenheight = win.winfo_screenheight()
  img_path = 'img/one.png'
  # img_path = 'img/bg.jpg'
  # img_path = 'img/test.jpg'
  # img_path = 'img/pic.gif'
  image = Image.open(img_path)
  image_x, image_y = image.size
  if image_x > screenwidth or image_y > screenheight:
    print('The picture size is too big,max should in:{}x{}, your:{}x{}'.format(screenwidth,
                                          screenheight,
                                          image_x,
                                          image_y))
  img = ImageTk.PhotoImage(image)
  canvas = tk.Canvas(frame, width=image_x, height=image_y, bg='pink')
  i = canvas.create_image(0, 0, anchor='nw', image=img)
  canvas.pack()
  canvas.bind('<Button-1>', left_mouse_down) # 鼠标左键按下
  canvas.bind('<ButtonRelease-1>', left_mouse_up) # 鼠标左键释放
  canvas.bind('<Button-3>', right_mouse_down) # 鼠标右键按下
  canvas.bind('<ButtonRelease-3>', right_mouse_up) # 鼠标右键释放
  canvas.bind('<B1-Motion>', moving_mouse) # 鼠标左键按下并移动
  win.mainloop()

原图one.png

Python基于tkinter canvas实现图片裁剪功能

运行

Python基于tkinter canvas实现图片裁剪功能

Python基于tkinter canvas实现图片裁剪功能

one_corp.png

Python基于tkinter canvas实现图片裁剪功能

源码(https://github.com/rainbow-tan/rainbow/tree/master/%E8%A3%81%E5%89%AA%E5%9B%BE%E7%89%87)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的字符串查找操作方法总结
Jun 27 Python
Python之读取TXT文件的方法小结
Apr 27 Python
对Python subprocess.Popen子进程管道阻塞详解
Oct 29 Python
对Python3+gdal 读取tiff格式数据的实例讲解
Dec 04 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
PyQt5实现简单数据标注工具
Mar 18 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
python对矩阵进行转置的2种处理方法
Jul 17 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
200行python代码实现贪吃蛇游戏
Apr 24 Python
python实战之90行代码写个猜数字游戏
Apr 22 Python
浅谈Python从全局与局部变量到装饰器的相关知识
Jun 21 Python
Python利用matplotlib绘制散点图的新手教程
Nov 05 #Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
Nov 05 #Python
Python word文本自动化操作实现方法解析
Nov 05 #Python
Python自动化办公Excel模块openpyxl原理及用法解析
Nov 05 #Python
Python中用xlwt制作表格实例讲解
Nov 05 #Python
如何利用pycharm进行代码更新比较
Nov 04 #Python
python产生模拟数据faker库的使用详解
Nov 04 #Python
You might like
easyui的tabs update正确用法分享
2014/03/21 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
详解jQuery选择器
2016/12/21 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
canvas雪花效果核心代码分享
2017/02/19 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
2019/09/24 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
python增加图像对比度的方法
2019/07/12 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
Python实现上下文管理器的方法
2020/08/07 Python
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
英语专业毕业生自我鉴定
2013/11/09 职场文书
宠物店的创业计划书范文
2014/01/11 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
教师节班会开场白
2015/06/01 职场文书