Python课程作业,因为不限方向,而且自己平时不会保存jpg文件,所以写了这个自用的程序,可以实现RAW文件向JPG文件的批量转换。
首先在程序中导入所需要的库,例如:Tkinter、os、rawpy、imageio、numpy和Pillow的Image和ImageTk模块。
然后定义一个convert_image()函数,它接受两个参数:一个输入文件路径和一个输出文件路径。函数使用rawpy库读取RAW格式图像文件,将其转换为numpy数组,然后将numpy数组转换为PIL Image对象。接着,对图像进行一些处理,如锐化和亮度和对比度增强。最后,函数将PIL Image对象转换为numpy数组,并将其保存为JPEG格式图像文件。
然后定义一个convert_folder()函数,它接受一个文件夹路径作为参数。函数使用os模块遍历文件夹中的所有.arw文件,并调用convert_image()函数将它们转换为JPEG格式图像。
然后创建一个Tkinter窗口,并设置窗口的标题和大小。在仓库中创建一个文件选择按钮,用于选择要转换的文件夹。
再创建一个用于显示转换后图像的面板,由于原图的比例是3:2,因此窗口的尺寸为600×400。
创建一个转换按钮,并绑定它的事件,调用convert_folder()函数并传入选择的文件夹路径。最后运行窗口,并且等待用户进行操作。
import tkinter as tk
from tkinter import filedialog
import os
import rawpy
import imageio
import numpy as np
from PIL import Image, ImageEnhance, ImageFilter, ImageTk
def convert_image(file_path, output_path):
# 使用rawpy打开文件并转换为numpy数组
with rawpy.imread(file_path) as raw:
raw_image = raw.postprocess()
# 转换numpy数组为PIL Image对象
pil_image = Image.fromarray(raw_image)
# 对图像进行锐化
pil_image = pil_image.filter(ImageFilter.SHARPEN)
# 对图像进行亮度和对比度增强
enhancer = ImageEnhance.Brightness(pil_image)
pil_image = enhancer.enhance(1.0)
enhancer = ImageEnhance.Contrast(pil_image)
pil_image = enhancer.enhance(1.2)
# 转换PIL Image对象为numpy数组
np_image = np.asarray(pil_image)
# 将numpy数组转换为jpg格式并保存到用户选择的输出路径和文件名
if output_path:
imageio.imwrite(output_path, np_image, format='jpg')
# 在窗口中显示转换后的图像
img = Image.open(output_path)
img = img.resize((600, 400))
img = ImageTk.PhotoImage(img)
panel.configure(image=img)
panel.image = img
def convert_folder(folder_path):
# 循环遍历文件夹中的所有.arw文件,并进行转换
for file_name in os.listdir(folder_path):
# 如果文件扩展名不是".arw",则跳过
if not file_name.lower().endswith('.arw'):
continue
# 构造完整的文件路径
file_path = os.path.join(folder_path, file_name)
# 构造输出文件路径和文件名
output_path = os.path.splitext(file_path)[0] + '.jpg'
# 调用转换函数
convert_image(file_path, output_path)
# 创建窗口
window = tk.Tk()
window.title("ARW Converter")
window.geometry("500x500")
# 创建文件选择按钮
button = tk.Button(window, text="选择文件夹", command=lambda: convert_folder(filedialog.askdirectory()))
button.pack()
# 创建显示图像的面板
panel = tk.Label(window)
panel.pack()
# 创建转换按钮
convert_button = tk.Button(window, text="转换")
convert_button.pack()
# 绑定转换按钮事件,调用convert_folder函数
convert_button.config(command=lambda: convert_folder(filedialog.askdirectory()))
# 运行窗口
window.mainloop()