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的randrange()方法使用教程
May 15 Python
python统计cpu利用率的方法
Jun 02 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
python并发和异步编程实例
Nov 15 Python
解决python多行注释引发缩进错误的问题
Aug 23 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
python的time模块和datetime模块实例解析
Nov 29 Python
python 初始化一个定长的数组实例
Dec 02 Python
python使用openpyxl库读写Excel表格的方法(增删改查操作)
May 02 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 Python
Python+DeOldify实现老照片上色功能
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
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
PHP关联链接常用代码
2012/11/05 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
dess中一个简单的多路委托的实现
2010/07/20 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
2013/12/11 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
[02:02]2018DOTA2亚洲邀请赛Mineski赛前采访
2018/04/04 DOTA
python函数缺省值与引用学习笔记分享
2013/02/10 Python
Python中的Classes和Metaclasses详解
2015/04/02 Python
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
三步实现Django Paginator分页的方法
2019/06/11 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
银行爱岗敬业演讲稿
2014/05/05 职场文书
本科毕业生求职信
2014/06/15 职场文书
先进个人总结范文
2015/02/15 职场文书
社会实践单位意见
2015/06/05 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL