python 实现图片裁剪小工具
作者:南风丶轻语 发布时间:2022-04-27 18:15:15
标签:python,图片,裁剪,工具
完整项目地址下载:https://github.com/rainbow-tan/rainbow/tree/master/%E8%A3%81%E5%89%AA%E5%9B%BE%E7%89%87
实现: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
运行
one_corp.png
来源:https://www.cnblogs.com/rainbow-tan/p/13898131.html


猜你喜欢
- 前言最近因为工作的需要,需要写个短链服务,用到了10->62进制,网上找了一个,可以转换最多76位进制的博客,现在分享出来,下面话不多
- 本文实例讲述了Python strip()函数的正则表达式实现方法。分享给大家供大家参考,具体如下:题目如下:写一个函数,它接受一个字符串,
- 第一:mysql服务的启动和停止net stop mysqlnet start mysql第二:登陆mysql –u用户名 [–h主机名或者
- 反射简介Go语言的反射是通过reflect包提供的,它允许我们在运行时访问接口的动态类型信息和值。其基本的操作包括获取一个类型的Kind(例
- 受<! #include file="filename.asp" --> 宏限制必须存在该文件并且会预先编译
- DATEPART() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。DATEDIFF() 函数返回两个日期之间的时间差。
- 这篇文章主要介绍了简单了解python字符串前面加r,u的含义,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 1.打开PyCharm,选择File--Settings2.依次选择Editor---Code Style-- File and Code
- python入门细节相除后的类型type(2/2)floattype(2//2)int双斜杠是整除,出来的类型是int。单斜杠的出来的是fl
- 程序一:负责从字典中随机提取数据,写入一个新文件。(1.php) <?php /* 从字典文件中提取随机值 */
- 简介LRU(Least Recently Used)最近最少使用,最近有时间和空间最近的歧义,所以我更喜欢叫它近期最少使用算法。它的核心思想
- 本文实例讲述了Python使用lambda表达式对字典排序操作。分享给大家供大家参考,具体如下:lambda表达式也常用于字典排序,既然写到
- 本文实例讲述了PHP连接MySQL数据库的三种方式。分享给大家供大家参考,具体如下:PHP与MySQL的连接有三种API接口,分别是:PHP
- 首先给大家分享一篇js中int和string数据类型互相转化实例https://www.aspxhome.com/article/15474
- 一、python判断文件和文件夹是否存在、创建文件夹 >>> import os>>> os.
- 实现代码# batch_handle_image.pyimport argparseimport globimport osfrom PIL
- 文件操作我们可以使用python来操作文件,比如读取文件内容、写入新的内容等,因为任何计算机文件的本质都是一些有不同后缀的字符组成的。pyt
- 用dicompyler软件打开dicom图像,头文件如图所示:当然也可以直接读取:ds = dicom.read_file('H:\
- python里使用正则表达式的组嵌套实例详解由于组本身是一个完整的正则表达式,所以可以将组嵌套在其他组中,以构建更复杂的表达式。下面的例子,
- 经过一段时间的开发与测试,终于发布了Lms框架的第一个正式版本(1.0.0版本),并给出了lms框架的样例项目lms.samples。本文通