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判断文本中消息重复次数的方法
Apr 27 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
Python与R语言的简要对比
Nov 14 Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 Python
Python3模拟curl发送post请求操作示例
May 03 Python
基于Python的Post请求数据爬取的方法详解
Jun 14 Python
Django使用Jinja2模板引擎的示例代码
Aug 09 Python
python输入错误后删除的方法
Oct 12 Python
PageFactory设计模式基于python实现
Apr 14 Python
超级实用的8个Python列表技巧
Aug 24 Python
python调用有道智云API实现文件批量翻译
Oct 10 Python
Django和Ueditor自定义存储上传文件的文件名
Feb 25 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
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
PHP与SQL注入攻击[二]
2007/04/17 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
MooTools 1.2介绍
2009/09/14 Javascript
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
2018/12/14 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
进一步探究Python的装饰器的运用
2015/05/05 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
英国玛莎百货新西兰:Marks & Spencer New Zealand
2019/07/21 全球购物
《天游峰的扫路人》教学反思
2014/04/25 职场文书
《长征》教学反思
2014/04/27 职场文书
个人年度总结报告
2015/03/09 职场文书
爱心捐助活动总结
2015/05/09 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
优秀创业计划书分享
2019/07/19 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android