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中asyncore的用法实例
Sep 29 Python
使用py2exe在Windows下将Python程序转为exe文件
Mar 04 Python
使用Python对SQLite数据库操作
Apr 06 Python
详解Python 模拟实现生产者消费者模式的实例
Aug 10 Python
对Python协程之异步同步的区别详解
Feb 19 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
基于matplotlib xticks用法详解
Apr 16 Python
如何导出python安装的所有模块名称和版本号到文件中
Jun 05 Python
python3.5的包存放的具体路径
Aug 16 Python
python之语音识别speech模块
Sep 09 Python
python实现文件分片上传的接口自动化
Nov 19 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
Apr 14 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
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
Yii快速入门经典教程
2015/12/28 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
php批量删除操作代码分享
2017/02/26 PHP
PHP使用PDO操作sqlite数据库应用案例
2019/03/07 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
细品javascript 寻址,闭包,对象模型和相关问题
2009/04/27 Javascript
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
浅析Angular19 自定义表单控件
2018/01/31 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
python散点图实例之随机漫步
2018/08/27 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
pygame实现五子棋游戏
2019/10/29 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
java关于string最常出现的面试题整理
2021/01/18 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
澳洲的UGG雪地靴超级市场:Uggs.com.au
2020/04/06 全球购物
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python