现在手机和单反拍摄的照片像素都在2千万像素以上,部分高端手机的像素甚至高达2亿像素,单张照片的大小往往在10M甚至20M以上,而一台14英寸笔记本电脑的默认分辨率为1920×1080=2,073,600,即2百万像素左右,动辄几千万像素的图片其实超出日常所需的清晰度。有的时候需要制作PPT或者视频,或者需要把图片进行分享,就要通过批量缩小照片的像素来缩小尺寸。小格基于Python开发了一个小程序,可以对指定文件夹及其子文件夹下的所有图片批量操作,减小图片像素,同时可以调整亮度、对比度、饱和度和锐度,欢迎大家下载试用,压缩包里包含小程序、使用说明和测试图片(小格7年前家养的宠物猫乐乐):
https://pan.baidu.com/s/1JMqhROVorYjFJTXY0zGnOQ?pwd=iReg
小程序使用Python编写,同时把源代码分享如下,供大家参考,也欢迎大家提出宝贵意见:
import os
from PIL import Image, ImageEnhance, ImageOps
import PIL
import tkinter
import tkinter.filedialog
import 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()