python实现GUI版图片锐化小工具

news2024/11/27 18:47:27

目录

  • 效果展示
  • 代码
  • 脚本代码

效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
锐化前:
在这里插入图片描述

锐化后

在这里插入图片描述

代码

sharpen_img.py

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk,ImageFilter
import os
class ImageViewerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("图片查看器")

        self.suffix = ''
        self.dirname_filename =''
        self.image_label = None
        self.new_window = None

        # 设置按钮用于打开文件对话框
        self.open_button = tk.Button(self.root, text="打开图片", command=self.open_image)
        self.open_button.pack(pady=20)

    def on_window_close(self,file_path):
        # 检查文件是否存在
        if os.path.exists(file_path):
            # 删除文件
            os.remove(file_path)
            print(f"原图已删除。")
        else:
            print(f"文件 {file_path} 不存在。")
        self.new_window.destroy()

    def on_escape(self,event):
        root.destroy()

    def resize_img(self,original_image):

        # 获取屏幕的长和宽
        screen_width = root.winfo_screenwidth()
        screen_height = root.winfo_screenheight()

        # 获取图片的长和宽
        image_width, image_height = original_image.size

        # 检查图片是否超出了屏幕大小,并相应地调整大小
        if image_width > screen_width-50 or image_height > screen_height-50:
            # 计算缩放比例,这里我们取屏幕和图片尺寸中较小的那个比例的70%
            scale_factor = min(screen_width / image_width, screen_height / image_height) * 0.8
            new_width = int(image_width * scale_factor)
            new_height = int(image_height * scale_factor)

            # 缩放图片
            resized_image = original_image.resize((new_width, new_height), Image.ANTIALIAS)

            # 转换为Tkinter可以显示的格式
            photo = ImageTk.PhotoImage(resized_image)
        else:
            # 图片不需要缩放,直接转换
            photo = ImageTk.PhotoImage(original_image)
        return photo

    def update_image(self,factor, input_image_path):
        """根据滑块的值更新图片"""
        global photo, original_image

        sharpened = self.sharpen_image(input_image_path, factor)
        # 对锐化后的图片缩放以使它小于屏幕大小
        photo = self.resize_img(sharpened)
        self.image_label.config(image=photo)
        self.image_label.image = photo  # 保持对photo的引用

    def next_window(self,file_path):
        # 创建一个新的窗口
        self.new_window = tk.Toplevel(root)

        self.new_window.title("图片锐化")

        # 绑定Esc键关闭窗口
        self.new_window.bind("<Escape>", self.on_escape)

        # 这样写会立即执行 on_window_close,直接把图片删除
        # self.new_window.protocol("WM_DELETE_WINDOW", self.on_window_close(file_path))

        self.new_window.protocol("WM_DELETE_WINDOW", lambda: self.on_window_close(file_path))

        self.suffix = file_path.split('.')[-1]
        self.dirname_filename = file_path.split('.')[0]

        # 打开图片##########################################################
        original_image = Image.open(file_path)
        # 输入打开后的图片流 对图片进行resize,然后返回photo
        photo = self.resize_img(original_image)

        # 显示图片
        self.image_label = tk.Label(self.new_window)
        self.image_label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        self.image_label.config(image=photo)
        self.image_label.image = photo  # 保持对photo的引用

        # 滑块,用于调整锐化级别
        slider = tk.Scale(self.new_window, from_=0.0, to=10.0, orient="horizontal",
                          command=lambda value: self.update_image(slider.get(), file_path))

        slider.pack(side=tk.BOTTOM, fill=tk.X, pady=10)


    def sharpen_image(self,input_image_path, factor):
        img = Image.open(input_image_path)
        sharpened_img = img.filter(ImageFilter.UnsharpMask(radius=factor, threshold=3))  # 注意:这里假设我们只用radius和threshold
        output_image_path = self.dirname_filename + f'_new.' + self.suffix
        sharpened_img.save(output_image_path)
        return sharpened_img

    def open_image(self):
        # 打开文件对话框,选择图片
        file_path = filedialog.askopenfilename(filetypes=[("图片文件", "*.png;*.jpg;*.jpeg;*.gif;*.bmp")])
        if file_path:
            # 打开新窗口
            self.next_window(file_path)


if __name__ == "__main__":
    root = tk.Tk()
    app = ImageViewerApp(root)
    root.mainloop()

脚本代码

sharpen_img.bat

@echo on
chcp 65001
E:
cd E:\pythonProject\ImageTools\sharpen_image
call H:\Programmer_Software\anaconda2022\Scripts\activate base
python v3_sharpen_image.py
exit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1957013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

空气净化器CE认证简介

空气净化器中有多种不同的技术和介质&#xff0c;使它能够向用户提供清洁和安全的空气。由于空气净化器本身就和我们的生活息息相关。因此对于产品本身的安全性是消费者首先需要考虑的&#xff0c;另一方面就是其在净化空气上的效率和效果。如今国内的空气净化器随着工艺上的不…

ts 下使用 interactjs 的时候,事件类型该如何定义 InteractEvent

ts 下使用 interactjs 的时候&#xff0c;事件类型该如何定义 InteractEvent 一、问题 interactjs 是一个很好用的给元素添加拖动事件的插件&#xff0c;它可以实现如下的效果。 其官网是 https://interactjs.io/ vitetsvue3 项目中用到了 interactjs 这个库&#xff0c;但在…

42度酒和52度酒哪个好?

我们平时在聚会的时候都会喝酒&#xff0c;而在买酒时通常会看到超市或者白酒专卖店里的白酒大多都是52度或者是42度的&#xff0c;而喝酒的人当中大多对白酒没有一定的了解&#xff0c;所以在接到买酒任务的时候&#xff0c;当看到一款酒有两种度数的时候&#xff0c;就有些拿…

元宇宙营销,能够持续下去吗?

Photo by Oberon Copeland veryinformed.com on Unsplash 一场完美风暴让一些行业观察人士怀疑&#xff0c;元宇宙这个曾经营销界最喜欢的闪亮对象&#xff0c;是否正在维持生命。像ChatGPT这样的生成式人工智能(AI)已经接管了技术炒作周期&#xff1b;关键平台的参与度微乎其…

为什么要加密源代码?六款好用的源代码加密软件推荐

在当今数字化时代&#xff0c;源代码是许多企业和开发人员最重要的资产之一。无论是保护知识产权、维护竞争优势&#xff0c;还是确保应用程序的安全性&#xff0c;加密源代码都是至关重要的措施。以下将详细探讨为什么需要加密源代码&#xff0c;并推荐六款好用的源代码加密软…

手把手教你暗通道先验去雾算法

0&#xff0c;流程 暗通道先验去雾算法&#xff08;Dark Channel Prior, DCP&#xff09;是一种基于图像的去雾技术&#xff0c;由Kaiming He等人在2009年提出。这种算法利用了大气散射模型&#xff0c;通过估计大气光和图像的传输图来去除雾的影响。以下是暗通道先验去雾算法…

PLC网关:开启工业4.0时代的智能工厂之路

PLC即可编程逻辑控制器&#xff0c;是工业自动化领域的核心设备&#xff0c;广泛应用于各个工业领域。从PLC问世至今&#xff0c;一直表现出强大的生命力和高速增长态势&#xff0c;2020年全球PLC市场的销售量已经达到了百亿RMB级别。 随着行业智能化、数字化推广&#xff0c;…

Docker从入门到实践教程(电子版)

前言 Docker 是个伟大的项目&#xff0c;它彻底释放了虚拟化的威力&#xff0c;极大降低了云计算资源供应的成本&#xff0c;同时让应用的 分发、测试、部署和分发都变得前所未有的高效和轻松&#xff01; 本电子书既适用于具备基础 Linux 知识的 Docker 初学者&#xff0c;也…

hot100-5-普通数组

53最大子数组和 56合并区间 238除自身以外数组的乘积 用前缀乘积和后缀乘积 41缺失的第一个正数 189轮转数组

文本编辑三剑客(awk)

awk作为和sed、grep同级的文本处理命令&#xff0c;也又强大的文本分析功能&#xff0c;同样&#xff0c;它的原理并不困难&#xff0c;但操作很多且很杂&#xff0c;可以通过不同的需求进行自定义搭配。 awk工作原理 awk和另外两个命令的工作原理又不相同&#xff0c;当用户…

关于使用Postman在请求https网址没有响应,但是用浏览器有响应的问题解决

一、问题描述 使用postman调用正式环境的公共接口&#xff0c;无需鉴权&#xff0c;但是产生了返回状态码200&#xff0c;但是data中却无数据&#xff0c;如下 {"code": "200","message": "操作成功","data": {"qr_c…

【图解网络】学习记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 TCP/IP 网络模型有哪几层&#xff1f;键入网址到网页显示&#xff0c;期间发生了什么&#xff1f;Linux 系统是如何收发网络包的&#xff1f;NAPIHTTP 是什么&#…

Flask Bootstrap #3 - BootStrap快速入门

Reference https://www.bilibili.com/video/BV1AQe9eqEj7/?p2&spm_id_frompageDriver&vd_source3d4b12fb4a4bfbc98942d43612ae2fb9 1 BootStrap BootStrap&#xff0c;别人写好的一堆css样式&#xff0c;我们可以直接拿过来用&#xff0c;我们只要掌握两点就可以开…

【TabBar嵌套Navigation案例-自定义tabBar-封装 Objective-C语言】

一、再来说一个自定义tabbar的问题啊, 1.首先呢,这个tabbar,看起来好像效果是实现了,没有什么问题,但是说,从业务逻辑上来讲的话,这样做,是不太好的, 1)首先,我们去创建啊,我们自定义的一个UIView, UIView里边,有很多子控件,那么这个子控件,应该是写在你这个V…

kubernetes管理GUI工具Lens

从github上可以知道&#xff0c;lens的前端是用electron做的客户端工具&#xff0c;打开安装路径你会发现kubectl.exe,没错&#xff0c;就是你经常用的kubectl命令行的客户端工具。kubectl本来就能输出json的数据类型&#xff0c;集成前端更方便了。看到这里你是不是发现&#…

MoE技术揭秘——混合专家模型的计算奥秘

MoE技术揭秘——混合专家模型的计算 MoE技术的类比 你可以把MoE技术比作一个“智能团队”&#xff0c;团队中的每个成员&#xff08;专家&#xff09;都有自己擅长的领域。当面对一个问题时&#xff0c;只有擅长此问题的成员才会参与解答&#xff0c;这样既提高了效率&#xff…

如何开发属于自己直播平台的主播美颜SDK?

本篇文章&#xff0c;笔者将从需求分析、技术选型、开发流程等方面进行详细讲解。 一、需求分析 在开发美颜SDK之前&#xff0c;首先需要进行详细的需求分析。主要包括以下几个方面&#xff1a; 1.美颜功能的具体需求&#xff1a;确定美颜效果&#xff0c;包括磨皮、美白、瘦…

懂个锤子Vue 项目工程化扩展:

Vue项目工程化扩展&#x1f4f6;&#xff1a; 前言&#xff1a;当然既然学习框架的了&#xff0c;HTMLCSSJS三件套必须的就不说了&#xff1a; JavaScript 快速入门 紧跟前文&#xff0c;目标学习Vue2.0——3.0&#xff1a; 懂个锤子Vue、WebPack5.0、WebPack高级进阶 涉及的…

4418 4412 的 bl1 , bl2 的理解

之前一直 对 三星的 bl1 , bl2 不是很理解。 网上的资料 我自己的 测试&#xff1a; 我在 4418 的源码中没有找到这个 2ndboot 文件夹。

仅花3小时搭好一套仓库管理系统,老板看了直呼哇塞

公司仓库管理长期效率低下&#xff0c;让团队头疼不已。没想到&#xff0c;一位同事凭借自学的零代码系统搭建技能&#xff0c;仅用时3小时就搭建出了一套完善的仓库管理系统&#xff0c;不仅操作简便&#xff0c;还大幅提升了工作效率。老板亲自验收后连连夸赞直接给了1w奖金&…