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多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
解析Python中的变量、引用、拷贝和作用域的问题
Apr 07 Python
使用httplib模块来制作Python下HTTP客户端的方法
Jun 19 Python
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 Python
django实现同一个ip十分钟内只能注册一次的实例
Nov 03 Python
python3+PyQt5实现自定义窗口部件Counters
Apr 20 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
python实现猜数游戏(保存游戏记录)
Jun 22 Python
Python字典取键、值对的方法步骤
Sep 30 Python
python实战之一步一步教你绘制小猪佩奇
Apr 22 Python
详解python的内存分配机制
May 10 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
PHP小技巧之函数重载
2014/06/02 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
Angular 表单控件示例代码
2017/06/26 Javascript
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
python批量查询、汉字去重处理CSV文件
2018/05/31 Python
Python之列表实现栈的工作功能
2019/01/28 Python
H5调用相机拍照并压缩图片的实例代码
2017/07/20 HTML / CSS
物流专业毕业生推荐信范文
2013/11/18 职场文书
商超业务员岗位职责
2014/03/12 职场文书
年度评优评先方案
2014/06/03 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
活动主持人开场白
2015/05/28 职场文书
幼儿园体操比赛口号
2015/12/25 职场文书
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL
无线电通信名词解释
2022/02/18 无线电
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python