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的Flask框架中验证注册用户的Email的方法
Sep 02 Python
python定时利用QQ邮件发送天气预报的实例
Nov 17 Python
Python装饰器用法示例小结
Feb 11 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
Python List cmp()知识点总结
Feb 18 Python
详解python读取image
Apr 03 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
Python 如何在字符串中插入变量
Aug 01 Python
python装饰器三种装饰模式的简单分析
Sep 04 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 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程序员应该了解MongoDB的五件事
2013/06/03 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
PHP chop()函数讲解
2019/02/11 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
js实现文字滚动效果
2016/03/03 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
python Django连接MySQL数据库做增删改查
2013/11/07 Python
Python性能优化技巧
2015/03/09 Python
解决pycharm的Python console不能调试当前程序的问题
2019/01/20 Python
如何通过python画loss曲线的方法
2019/06/26 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
python 绘制国旗的示例
2020/09/27 Python
Python Pandas数据分析工具用法实例
2020/11/05 Python
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
抽样调查项目计划书
2014/04/24 职场文书
会计求职简历自我评价
2015/03/10 职场文书
利用python做表格数据处理
2021/04/13 Python
python基础详解之if循环语句
2021/04/24 Python
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
Nginx 配置 HTTPS的详细过程
2022/05/30 Servers