iReg小程序:图片批量处理器 v3.0

文摘   职场   2024-11-17 07:00   上海  

现在手机和单反拍摄的照片像素都在2万像素以上,部分高端手机的像素甚至高达2亿像素,单张照片的大小往往在10M甚至20M以上,而一台14英寸笔记本电脑的默认分辨率为1920×1080=2,073,600,即2百万像素左右,动辄几千万像素的图片其实超出日常所需的清晰度。有的时候需要制作PPT或者视频,或者需要把图片进行分享,就要通过批量缩小照片的像素来缩小尺寸。小格基于Python开发了一个小程序,可以对指定文件夹及其子文件夹下的所有图片批量操作,减小图片像素,同时可以调整亮度对比度饱和度锐度,欢迎大家下载试用,压缩包里包含小程序、使用说明和测试图片(小格7年前家养的宠物猫乐乐):

https://pan.baidu.com/s/1JMqhROVorYjFJTXY0zGnOQ?pwd=iReg

小程序为电脑Windows上直接可以运行的exe文件,以下示例把像素调整为初始值的50%亮度对比度饱和度调整为初始值的120%。点击“浏览”选择需要处理的图片所在的目录,点击“开始处理”,处理后的图片在与所选目录同级的“处理后图片”目录下。小格自己亲身试验,把像素调整为初始值的50%,一些图片尺寸甚至可以缩小为原来的十分之一:

本次更新后的3.0版本还增加了一个图像压缩的功能,可以在不减少图像像素的同时压缩图像尺寸,实测的结果,如果图像压缩参数选择“60”,可以将5MB的图片(2千万像素)压缩到500KB,而且图片质量几乎没有降低,大家可以用小格提供的宠物猫乐乐的照片做一下测试~~

小程序使用Python编写,同时把源代码分享如下,供大家参考,也欢迎大家提出宝贵意见:

import osfrom PIL import Image, ImageEnhance, ImageOpsimport PILimport tkinterimport tkinter.filedialogimport tkinter.messagebox
class Window(): def __init__(self): # 初始化Tkinter主窗口 self.root = root = tkinter.Tk()
# 创建并放置像素调整输入框和相关标签 self.label = tkinter.Label(root, text='像素调整为初始值的:') self.label.grid(row=0, column=0) self.entryPixel = tkinter.Entry(root) # 输入框用于输入像素调整百分比 self.entryPixel.grid(row=0, column=1) self.label = tkinter.Label(root, text='%') self.label.grid(row=0, column=2)
# 创建并放置亮度调整输入框和相关标签 self.label = tkinter.Label(root, text='亮度调整为初始值的:') self.label.grid(row=1, column=0) self.entryBrightness = tkinter.Entry(root) # 输入框用于输入亮度调整百分比 self.entryBrightness.grid(row=1, column=1) self.label = tkinter.Label(root, text='%') self.label.grid(row=1, column=2)
# 创建并放置对比度调整输入框和相关标签 self.label = tkinter.Label(root, text='对比度调整为初始值的:') self.label.grid(row=2, column=0) self.entryContrast = tkinter.Entry(root) # 输入框用于输入对比度调整百分比 self.entryContrast.grid(row=2, column=1) self.label = tkinter.Label(root, text='%') self.label.grid(row=2, column=2)
# 创建并放置饱和度调整输入框和相关标签 self.label = tkinter.Label(root, text='饱和度调整为初始值的:') self.label.grid(row=3, column=0) self.entryColor = tkinter.Entry(root) # 输入框用于输入饱和度调整百分比 self.entryColor.grid(row=3, column=1) self.label = tkinter.Label(root, text='%') self.label.grid(row=3, column=2)
# 创建并放置锐度调整输入框和相关标签 self.label = tkinter.Label(root, text='锐度调整为初始值的:') self.label.grid(row=4, column=0) self.entrySharpness = tkinter.Entry(root) # 输入框用于输入锐度调整百分比 self.entrySharpness.grid(row=4, column=1) self.label = tkinter.Label(root, text='%') self.label.grid(row=4, column=2)
# 创建并放置图像压缩输入框和相关标签 self.label = tkinter.Label(root, text='图像压缩(建议60-75):') self.label.grid(row=5, column=0) self.entryReduceSize = tkinter.Entry(root) # 输入框用于输入图像压缩百分比 self.entryReduceSize.grid(row=5, column=1) self.label = tkinter.Label(root, text='%') self.label.grid(row=5, column=2)
# 创建并放置目录选择输入框和浏览按钮 self.label = tkinter.Label(root, text='选择目录') self.label.grid(row=6, column=0) self.entryDir = tkinter.Entry(root) # 输入框用于显示选择的目录路径 self.entryDir.grid(row=6, column=1) self.BrowserDirButton = tkinter.Button(root, text='浏览', command=self.BrowserDir) # 浏览按钮,用于选择目录 self.BrowserDirButton.grid(row=6, column=2)
# 创建并放置开始处理按钮 self.ButtonCov = tkinter.Button(root, text='开始处理', command=self.Conv) # 开始处理按钮,触发图像处理 self.ButtonCov.grid(row=7, column=1)
def BrowserDir(self): # 弹出目录选择对话框,并将选择的目录路径显示在输入框中 directory = tkinter.filedialog.askdirectory(title='iReg') if directory: self.entryDir.delete(0, tkinter.END) self.entryDir.insert(tkinter.END, directory)
def process_image(self, image): try: # 根据用户输入的百分比调整图像像素 if self.entryPixel.get() != "": width, height = image.size newwidth = int(width * int(self.entryPixel.get()) / 100) newheight = int(height * int(self.entryPixel.get()) / 100) image = image.resize((newwidth, newheight), PIL.Image.NEAREST)
# 根据用户输入的百分比调整图像亮度 if self.entryBrightness.get() != "": image = ImageEnhance.Brightness(image).enhance(int(self.entryBrightness.get()) / 100) # 根据用户输入的百分比调整图像对比度 if self.entryContrast.get() != "": image = ImageEnhance.Contrast(image).enhance(int(self.entryContrast.get()) / 100)
# 根据用户输入的百分比调整图像饱和度 if self.entryColor.get() != "": image = ImageEnhance.Color(image).enhance(int(self.entryColor.get()) / 100)
# 根据用户输入的百分比调整图像锐度 if self.entrySharpness.get() != "": image = ImageEnhance.Sharpness(image).enhance(int(self.entrySharpness.get()) / 100) except: pass return image
def Conv(self): # 获取用户选择的目录路径 path = self.entryDir.get() photo_extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.gif'] # 支持的图片扩展名 n = 0 # 记录处理的图片数量 # 获取父目录,并在其下创建用于保存处理后的图片的目录 parent_directory = os.path.dirname(path) output_dir = os.path.join(parent_directory, "处理后图片") os.makedirs(output_dir, exist_ok=True) # 遍历用户选择的目录及其子目录,处理所有支持的图片文件 for root, dirs, files in os.walk(path): for file in files: if file.lower().endswith(tuple(photo_extensions)): f_img = os.path.join(root, file) try: image = Image.open(f_img) image = ImageOps.exif_transpose(image) # 处理图片的EXIF信息,确保图片方向正确 processed_image = self.process_image(image) # 处理图片 # 保持原目录结构保存处理后的图片 relative_path = os.path.relpath(root, path) save_dir = os.path.join(output_dir, relative_path) os.makedirs(save_dir, exist_ok=True) save_path = os.path.join(save_dir, file) # 根据用户输入的压缩百分比保存图片 if self.entryReduceSize.get() != "": processed_image.save(save_path, quality=int(self.entryReduceSize.get())) else: processed_image.save(save_path) n += 1 except: pass # 显示处理完成的消息框 tkinter.messagebox.showinfo("iReg", f"已完成 {n} 张图片的处理。")
def mainloop(self): # 设置窗口的最小和最大尺寸,以及窗口标题,并进入Tkinter主循环 self.root.minsize(430, 230) self.root.maxsize(430, 230) self.root.title('iReg图片批量处理器 v3.0') self.root.mainloop()
if __name__ == "__main__": # 创建并运行窗口实例 window = Window() window.mainloop()

iReg
iReg,爱注册——交流药品注册法规,分享药品注册经验
 最新文章