中文路径优化
import cv2
import os
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
import numpy as np
from PIL import ImageTk, Image
# 创建一个函数用于打开图片对话框
def open_image_dialog():
file_path = filedialog.askopenfilename(title="选择图片", filetypes=[("图片文件", "*.jpg;*.jpeg;*.png;*.bmp")])
if file_path:
# 使用原始字符串处理路径中的中文字符
file_path = file_path.encode('utf-8').decode('utf-8') # 确保路径是UTF-8编码
print(file_path)
global original_image, original_filename
# 尝试读取图像文件
original_image = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_COLOR)
if original_image is None:
messagebox.showerror("检查路径:"+file_path)
else:
original_filename = os.path.basename(file_path)
image_label.config(text="已选择图片:" + original_filename)
display_image(original_image)
# 创建一个函数用于将图片转换为灰度
def convert_to_gray():
global original_image
gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
new_filename = original_filename.split('.')[0] + "g." + original_filename.split('.')[1]
new_file_path = os.path.join(os.path.dirname(original_filename), new_filename)
cv2.imwrite(new_file_path, gray_image)
messagebox.showinfo("成功", "图片已转换并保存为:\n" + new_filename)
display_image(gray_image)
# 创建一个函数用于显示图片
def display_image(image):
# 将图像转换为 RGB 格式以在 tkinter 上显示
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 将 NumPy 数组转换为 PIL Image,并调整大小
img = Image.fromarray(rgb_image)
img = img.resize((300, 300), Image.ANTIALIAS)
# 将 PIL Image 转换为 PhotoImage
photo = ImageTk.PhotoImage(img)
# 在 tkinter 的 Label 上显示 PhotoImage
image_label.config(image=photo)
image_label.image = photo # 保持对 PhotoImage 的引用
# 创建 tkinter 窗口
root = tk.Tk()
root.title("图片转灰度工具")
# 创建一个 Frame 用于放置按钮
button_frame = tk.Frame(root)
button_frame.pack(pady=10)
# 创建一个 Label 用于显示图片信息
image_label = tk.Label(root, text="请选择图片", font=("Helvetica", 12))
image_label.pack(pady=20)
# 创建一个 Button 用于选择图片,并放置到 Frame 中
choose_button = tk.Button(button_frame, text="选择图片", command=open_image_dialog)
choose_button.pack(side=tk.LEFT, padx=5)
# 创建一个 Button 用于转换图片,并放置到 Frame 中
convert_button = tk.Button(button_frame, text="转换为灰度", command=convert_to_gray)
convert_button.pack(side=tk.LEFT, padx=5)
# 创建一个 Button 用于取消操作,并放置到 Frame 中
cancel_button = tk.Button(button_frame, text="取消", command=root.destroy)
cancel_button.pack(side=tk.LEFT, padx=5)
# 运行 tkinter 主循环
root.mainloop()