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正则表达式去掉数字中的逗号(python正则匹配逗号)
Dec 25 Python
python抽象基类用法实例分析
Jun 04 Python
Pandas之groupby( )用法笔记小结
Jul 23 Python
centos7之Python3.74安装教程
Aug 15 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
pytorch 实现tensor与numpy数组转换
Dec 27 Python
使用opencv中匹配点对的坐标提取方式
Jun 04 Python
Python私有属性私有方法应用实例解析
Sep 15 Python
如何完美的建立一个python项目
Oct 09 Python
pycharm + django跨域无提示的解决方法
Dec 06 Python
Django用内置方法实现简单搜索功能的方法
Dec 18 Python
jupyter notebook指定启动目录的方法
Mar 02 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
Search Engine Friendly的URL设计
2006/10/09 PHP
PHP采集相关教程之一 CURL函数库
2010/02/15 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
JavaScript获取网页表单提交方式的方法
2015/04/02 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
2019/01/15 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
一百多行python代码实现抢票助手
2018/09/25 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
postman和python mock测试过程图解
2020/02/22 Python
keras slice layer 层实现方式
2020/06/11 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
美国旅游签证工作证明
2014/10/14 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS