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中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
Python文件右键找不到IDLE打开项解决办法
Jun 08 Python
Python中将字典转换为XML以及相关的命名空间解析
Oct 15 Python
Python基础篇之初识Python必看攻略
Jun 23 Python
浅谈Python中的zip()与*zip()函数详解
Feb 24 Python
解读python logging模块的使用方法
Apr 17 Python
Python XlsxWriter模块Chart类用法实例分析
Mar 11 Python
Python for循环及基础用法详解
Nov 08 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
django创建css文件夹的具体方法
Jul 31 Python
python实现在列表中查找某个元素的下标示例
Nov 16 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
May 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
Mac地址验证的javascript代码
2013/11/09 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
js中取得变量绝对值的方法
2015/01/03 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
Python socket聊天脚本代码实例
2020/01/02 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
荷兰超市:DEEN
2018/03/14 全球购物
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
贝佳斯官方网站:Borghese
2020/05/08 全球购物
代收款委托书范本
2014/10/01 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书
暑假打工感想
2015/08/07 职场文书
Python OpenCV之常用滤波器使用详解
2022/04/07 Python
Golang解析JSON对象
2022/04/30 Golang