【Python】一个简单的小案例:实现批量修改图片格式

news2024/11/20 3:31:35

1.代码

import os
from tkinter import Tk, Button
from PIL import Image


def check_and_create_folders():
    # 获取当前目录
    current_directory = os.getcwd()

    # 定义文件夹名称
    folders_to_check = ["JPG", "PNG"]

    for folder_name in folders_to_check:
        folder_path = os.path.join(current_directory, folder_name)

        # 检查文件夹是否存在
        if os.path.exists(folder_path):
            print(f"文件夹'{folder_name}'已存在。")
        else:
            # 如果不存在则创建文件夹
            os.makedirs(folder_path)
            print(f"文件夹'{folder_name}'已创建。")


def jpg_to_png():
    source_folder = os.path.join(os.getcwd(), "JPG")
    destination_folder = os.path.join(os.getcwd(), "PNG")

    # 创建PNG文件夹(如果不存在)
    os.makedirs(destination_folder, exist_ok=True)

    for filename in os.listdir(source_folder):
        if filename.lower().endswith(".jpg"):
            # 读取图像
            image_path = os.path.join(source_folder, filename)
            try:
                img = Image.open(image_path)

                # 生成PNG文件名
                png_filename = os.path.splitext(filename)[0] + ".png"
                png_path = os.path.join(destination_folder, png_filename)

                # 保存为PNG格式
                img.save(png_path, "PNG")

                print(f"转换完成: {filename} -> {png_filename}")

            except Exception as e:
                print(f"无法转换 {filename}: {str(e)}")


def png_to_jpg():
    source_folder = os.path.join(os.getcwd(), "PNG")
    destination_folder = os.path.join(os.getcwd(), "JPG")

    # 创建JPG文件夹(如果不存在)
    os.makedirs(destination_folder, exist_ok=True)

    for filename in os.listdir(source_folder):
        if filename.lower().endswith(".png"):
            # 读取图像
            image_path = os.path.join(source_folder, filename)
            try:
                img = Image.open(image_path)

                # 生成JPG文件名
                jpg_filename = os.path.splitext(filename)[0] + ".jpg"
                jpg_path = os.path.join(destination_folder, jpg_filename)

                # 保存为JPG格式
                img.convert("RGB").save(jpg_path, "JPEG")

                print(f"转换完成: {filename} -> {jpg_filename}")

            except Exception as e:
                print(f"无法转换 {filename}: {str(e)}")


def create_gui():
    root = Tk()
    root.title("文件格式转换工具")
    root.geometry("400x300")

    check_and_create_folders()

    button_width = 15
    button_height = 1

    # 创建按钮并添加事件监听器
    jpg_to_png_button = Button(root, text="JPG转PNG", command=jpg_to_png, width=button_width, height=button_height)
    jpg_to_png_button.place(relx=0.5, rely=0.3, anchor="center")

    png_to_jpg_button = Button(root, text="PNG转JPG", command=png_to_jpg, width=button_width, height=button_height)
    png_to_jpg_button.place(relx=0.5, rely=0.6, anchor="center")

    # 运行GUI主循环
    root.mainloop()


if __name__ == "__main__":
    create_gui()

2.功能

1.create_gui()

该函数用于创建一个简单的图形用户界面(GUI)。具体功能如下:

  1. 创建一个Tk窗口对象,即主窗口。
  2. 设置主窗口的标题为“文件格式转换工具”。
  3. 设置主窗口的大小为宽400高300。
  4. 调用check_and_create_folders函数,该函数用于检查并在当前目录下创建文件夹“JPG”和“PNG”。
  5. 定义按钮的宽度为15,高度为1。
  6. 创建两个按钮,分别是“JPG转PNG”和“PNG转JPG”,并分别绑定点击事件(command)为jpg_to_pngpng_to_jpg函数。
  7. 使用place方法设置按钮的位置,使其在窗口中居中显示。
  8. 启动GUI的主循环,使窗口保持打开状态,等待用户交互。

2.check_and_create_folders()

该函数主要作用是检查并在当前工作目录下创建两个文件夹:“JPG”和“PNG”。具体功能描述如下:

  1. 获取当前工作目录,使用os.getcwd()
  2. 定义一个包含文件夹名称的列表 folders_to_check,其中包括 "JPG" 和 "PNG"。
  3. 遍历 folders_to_check 中的每个文件夹名称。
  4. 使用 os.path.join 构建每个文件夹的完整路径。
  5. 使用 os.path.exists 检查文件夹是否已经存在。
  6. 如果文件夹已经存在,则打印一条消息表示文件夹已存在。
  7. 如果文件夹不存在,则使用 os.makedirs 创建文件夹,并打印一条消息表示文件夹已创建。

3.jpg_to_png()

该函数主要功能是将当前目录下文件夹“JPG”中所有 .jpg 格式的图片转换为 .png 格式,并将转换后的图片保存到当前目录下的“PNG”文件夹中。具体功能描述如下:

  1. 构建源文件夹路径为当前工作目录下的“JPG”文件夹。
  2. 构建目标文件夹路径为当前工作目录下的“PNG”文件夹。
  3. 使用 os.makedirs 创建“PNG”文件夹(如果不存在)。
  4. 遍历源文件夹中所有文件。
  5. 对于每个 .jpg 格式的文件,读取图像。
  6. 使用 Image.open 打开图像文件。
  7. 生成对应的 .png 文件名。
  8. 将图像以 .png 格式保存到“PNG”文件夹中。
  9. 打印转换完成的信息,包括原文件名和新文件名。
  10. 如果在图像处理过程中发生异常,打印无法转换的错误信息。

4.png_to_jpg()

该函数主要功能是将当前目录下文件夹“PNG”中所有 .png 格式的图片转换为 .jpg 格式,并将转换后的图片保存到当前目录下的“JPG”文件夹中。具体功能描述如下:

  1. 构建源文件夹路径为当前工作目录下的“PNG”文件夹。
  2. 构建目标文件夹路径为当前工作目录下的“JPG”文件夹。
  3. 使用 os.makedirs 创建“JPG”文件夹(如果不存在)。
  4. 遍历源文件夹中所有文件。
  5. 对于每个 .png 格式的文件,读取图像。
  6. 使用 Image.open 打开图像文件。
  7. 生成对应的 .jpg 文件名。
  8. 将图像以 .jpg 格式保存到“JPG”文件夹中。
  9. 打印转换完成的信息,包括原文件名和新文件名。
  10. 如果在图像处理过程中发生异常,打印无法转换的错误信息。

3.效果

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

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

相关文章

Java/Python/Go不同开发语言基础数据结构和相关操作总结-Map篇

Java/Python/Go不同开发语言基础数据结构和相关操作总结 1. Java1.1 基础操作1.1.1 数据结构和定义方式1.1.2 增加1.1.3 修改1.1.4 查询1.1.5 删除1.1.6 获取总长度1.1.7 按key排序1.1.8 按value排序1.1.9 遍历 1.2 常用其他方法1.2.1 几种数据结构的对比 2. Go2.1基础操作2.1.…

代码随想录算法训练营第二十四天| 77. 组合。

77. 组合 题目链接:组合 题目描述: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 解题思路: 本题是经典的回溯法解决的组合问题,回溯问题搞清楚纵向递归横向遍历即…

Redis核心技术与实战【学习笔记】 - 12.Redis删除数据后,为什么内存占用率还是很高?

前言 在使用 Redis 是,经常会遇到一个问题:明明做了数据删除,数据量不大,但是 使用 top 命令查看时,发现 Redis 还是占用了很多内存。 这是因为,当删除数据后,Redis 释放的内存空间会由内存分…

Vivado编译介绍

Vivado编译介绍 合成是将寄存器传输级别(RTL)指定的设计转换为门级表示。AMD Vivado™ 合成是定时驱动的,并针对内存进行优化使用和性能。Vivado合成支持以下的可合成子集: •SystemVerilog:IEEE标准SystemVerilog统…

UniMSE: Towards Unified Multimodal Sentiment Analysis and Emotion Recognition

文章目录 UniMSE:实现统一的多模态情感分析和情绪识别文章信息研究目的研究内容研究方法1.总体架构2.Task Formalization3.Pre-trained Modality Fusion (PMF)4.Inter-modality Contrastive Learning5.总体损失函数6.Decoding Algorithm 结果与讨论代码和数据集符号…

博客网站系统测试报告

一、项目背景 博客网站系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有个页面构成:注册页、登录页、个人博客列表页、博客详情页、编辑博客页、修改博客页以及博客系统主页&#xf…

【项目实践02】【优先级阻塞队列】

文章目录 一、前言二、项目背景三、实现方案四、思路延伸1. 优先级队列1.1 concurrent 包下的 PriorityBlockingQueue1.2 Redisson 的优先级阻塞队列 2. jvisualvm 远程连接3. Jstack 高 CPU 排查 五、参考内容 一、前言 本系列用来记录一些在实际项目中的小东西,并…

【算法分析与设计】交换两个节点

📝个人主页:五敷有你 🔥系列专栏:算法分析与设计 ⛺️稳中求进,晒太阳 题目 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本…

实习日志11

1.文件上传报错 1.1.报错信息Invalid typed array length: -2 1.2.查看源码找出错误 定位到检查代码上传是否成功的代码出错,rDataArr[3] 0x03 var pData new Uint8Array(pDataLen);的pDataLen4 说明rDataArr只有0-3,其他数据都没有上传上来 说明…

DoubleEnsemble:基于样本重加权和特征选择的金融数据分析方法

现代机器学习模型(如深度神经网络和梯度提升决策树)由于其提取复杂非线性模式的优越能力,在金融市场预测中越来越受欢迎。然而,由于金融数据集的信噪比非常低,并且是非平稳的,复杂的模型往往很容易过拟合。…

leetcode189.轮转数组|超简单易于理解方法

题目 https://leetcode.cn/problems/rotate-array/description/https://leetcode.cn/problems/rotate-array/description/ 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输…

基于uniapp+vue酒店宾馆客房民宿管理系统设计 微信小程序_54ybz

APP性能需求 (1)顾客在安卓APP页面各种操作可及时得到反馈。 (2)该平台是提供给多个用户使用的平台,用户使用之前需要注册登录。登录验证后,用户才可进行各种操作[10]。 (3)管理员、…

Java 集合 04 综合练习-查找用户是否存在

练习、 代码: public class User{private String id;private String username;private int password;public User() {}public User(String id, String username, int password) {this.id id;this.username username;this.password password;}public String getI…

舟山长寿医学中心:引领生命科技前沿

在浩瀚的东海之滨,舟山群岛如一颗璀璨的明珠,镶嵌在碧波荡漾的大海之中。这里不仅拥有得天独厚的自然美景,更是一块充满生机与活力的健康宝地。舟山长寿医学中心,正是这片神奇的土地上的一颗璀璨明珠,致力于为全球人士…

Linux权限【上篇】

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 扩展知识&#xff1a…

react 之 UseReducer

UseReducer作用: 让 React 管理多个相对关联的状态数据 import { useReducer } from react// 1. 定义reducer函数,根据不同的action返回不同的新状态 function reducer(state, action) {switch (action.type) {case INC:return state 1case DEC:return state - 1de…

系统移植--无法启动Linux内核--报错VFS--挂载nfs失败

问题 找信息:VFS 可能的原因 1、开发板上内核启动参数中的虚拟机ubuntu IP和真实的 虚拟机的IP不一致 2、开发板上内核启动参数中虚拟机的共享目录和虚拟机 ubuntu上配置的nfs服务器上的共享目录不一致 3、nfs配置文件(/etc/exports)路径错误 与自己的共享文件…

Galah:一款功能强大的LLM驱动型OpenAI Web蜜罐系统

关于Galah Galah是一款功能强大的Web蜜罐,该工具由LLM大语言模型驱动,基于OpenAI API实现其功能。 很多传统的蜜罐系统会模拟一种包含了大量网络应用程序的网络系统,但这种方法非常繁琐,而且有其固有的局限性。Galah则不同&…

Transformer 自然语言处理(四)

原文:Natural Language Processing with Transformers 译者:飞龙 协议:CC BY-NC-SA 4.0 第十章:从头开始训练变换器 在本书的开头段落中,我们提到了一个名为 GitHub Copilot 的复杂应用,它使用类似 GPT 的…

C语言:详解操作符(上)

摘要: 本篇,我们将学习C语言中操作符的相关内容,操作符是C语言中重要的元素之一,在我们的代码中处处都有,下面我们将详细介绍操作符的相关内容,并结合一些代码例题加深印象。 目录 一、操作符的分类及介绍 …