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 相关文章推荐
记录Django开发心得
Jul 16 Python
使用python实现省市三级菜单效果
Jan 20 Python
python对象及面向对象技术详解
Jul 19 Python
Python环境变量设置方法
Aug 28 Python
python实现下载整个ftp目录的方法
Jan 17 Python
Python模块结构与布局操作方法实例分析
Jul 24 Python
Python实现字符串匹配的KMP算法
Apr 04 Python
深入解析神经网络从原理到实现
Jul 26 Python
Python hashlib常见摘要算法详解
Jan 13 Python
Pycharm和Idea支持的vim插件的方法
Feb 21 Python
如何将PySpark导入Python的放实现(2种)
Apr 26 Python
pytorch查看网络参数显存占用量等操作
May 12 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
人大复印资料处理程序_输入篇
2006/10/09 PHP
php学习笔记之 函数声明(二)
2011/06/09 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
js代码实现微博导航栏
2015/07/30 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
用实例解释Python中的继承和多态的概念
2015/04/27 Python
python基于socket实现网络广播的方法
2015/04/29 Python
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
一行Python代码制作动态二维码的实现
2019/09/09 Python
使用K.function()调试keras操作
2020/06/17 Python
pytorch __init__、forward与__call__的用法小结
2021/02/27 Python
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
意大利奢侈品零售商:ilDuomo Novara
2019/09/11 全球购物
什么是Remote Module
2016/06/10 面试题
高二美术教学反思
2014/01/14 职场文书
合作意向协议书范本
2014/03/31 职场文书
就业协议书的作用
2014/04/11 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
修辞手法有哪些?
2019/08/29 职场文书
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers