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中DJANGO简单测试实例
May 11 Python
Python算法输出1-9数组形成的结果为100的所有运算式
Nov 03 Python
Python常见字典内建函数用法示例
May 14 Python
利用Pytorch实现简单的线性回归算法
Jan 15 Python
python读取与处理netcdf数据方式
Feb 14 Python
Python count函数使用方法实例解析
Mar 23 Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 Python
python实现PolynomialFeatures多项式的方法
Jan 06 Python
PyQt5 QThread倒计时功能的实现代码
Apr 02 Python
Python关于OS文件目录处理的实例分享
May 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截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
浅析PHP 按位与或 (^ 、&amp;)
2013/06/21 PHP
一个图片地址分解程序(用于PHP小偷程序)
2014/08/23 PHP
php实现图片缩略图的方法
2016/03/29 PHP
PHP命名空间namespace用法实例分析
2016/09/27 PHP
PHP请求远程地址设置超时时间的解决方法
2016/10/29 PHP
php获取数据库结果集方法(推荐)
2017/06/01 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
js最简单的拖拽效果实现代码
2010/09/24 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
JavaScript模拟push
2016/03/06 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
Three.JS实现三维场景
2018/12/30 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
简单说明Python中的装饰器的用法
2015/04/24 Python
python数据结构之链表详解
2017/09/12 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
招聘专员岗位职责
2014/03/07 职场文书
运动会班级前导词
2015/07/20 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
Nginx tp3.2.3 404问题解决方案
2021/03/31 Servers
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
CSS 圆形进度栏
2021/04/06 HTML / CSS
python如何利用traceback获取详细的异常信息
2021/06/05 Python
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS
HTML5中的DOCUMENT.VISIBILITYSTATE属性详解
2023/05/07 HTML / CSS