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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
利用Python画ROC曲线和AUC值计算
Sep 19 Python
Python实现简单的多任务mysql转xml的方法
Feb 08 Python
利用Python查看目录中的文件示例详解
Aug 28 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
Python切片操作去除字符串首尾的空格
Apr 22 Python
python判断所输入的任意一个正整数是否为素数的两种方法
Jun 27 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
python实现超级玛丽游戏
Mar 18 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
python中什么是面向对象
Jun 11 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版自动生成文章摘要
2008/07/23 PHP
php 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
php实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
javascript事件模型代码
2007/07/01 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
深入理解js promise chain
2016/05/05 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
Python实现去除代码前行号的方法
2015/03/10 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
Python如何生成树形图案
2018/01/03 Python
python 实现绘制整齐的表格
2019/11/18 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
python实现简单颜色识别程序
2020/02/19 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
Python常用外部指令执行代码实例
2020/11/05 Python
html5新特性与用法大全
2018/09/13 HTML / CSS
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
求职信:会计求职的写作技巧
2019/04/24 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
浅谈Python类的单继承相关知识
2021/05/12 Python
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
零基础学java之循环语句的使用
2022/04/10 Java/Android