引言
图像查看器是一种常见的实用程序,允许用户轻松查看和管理图像文件。使用 Python,可以创建简单的图像查看器,该查看器具有基本功能,例如打开图像、缩放和裁剪。本文将逐步介绍如何使用 Python 创建一个简单的图像查看器。
先决条件
在开始之前,确保满足以下先决条件:
- 已安装 Python 3 及以上版本
- 已安装 Pillow 库(
pip install Pillow
)
代码实现
1. 导入库
python
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
2. 创建窗口
python
root = tk.Tk()
root.title("Image Viewer")
3. 定义图像打开功能
“`python
def open_image():
# 打开文件选择对话框
filename = filedialog.askopenfilename(
title=”Select an Image”,
filetypes=((“All Images”, “.“), (“PNG”, “.png”), (“JPEG”, “.jpg”), (“BMP”, “*.bmp”))
)
if filename:
# 打开图像并缩放以适应窗口
image = Image.open(filename)
image.thumbnail((root.winfo_width(), root.winfo_height()))
# 创建图像的 Tkinter 图像对象
image_tk = ImageTk.PhotoImage(image)
# 创建标签并将其添加到窗口中
label = tk.Label(root, image=image_tk)
label.pack()
“`
4. 定义缩放功能
“`python
def zoom_in():
# 获取当前图像
image = label.image
# 缩放图像
image.thumbnail((image.width() * 1.2, image.height() * 1.2))
# 更新标签中的图像
image_tk = ImageTk.PhotoImage(image)
label.configure(image=image_tk)
def zoom_out():
# 获取当前图像
image = label.image
# 缩放图像
image.thumbnail((image.width() / 1.2, image.height() / 1.2))
# 更新标签中的图像
image_tk = ImageTk.PhotoImage(image)
label.configure(image=image_tk)
“`
5. 定义裁剪功能
“`python
def crop_image():
# 获取当前图像
image = label.image
# 创建裁剪对话框
crop_window = tk.Toplevel(root)
crop_window.title("Crop Image")
# 创建画布并添加到裁剪窗口中
canvas = tk.Canvas(crop_window, width=image.width(), height=image.height())
canvas.pack()
# 创建矩形选择器
rect = canvas.create_rectangle(0, 0, 100, 100)
# 设置鼠标事件处理程序以更新矩形选择器
def update_rectangle(event):
rect.coords(event.x, event.y, event.x + 1, event.y + 1)
canvas.bind("<B1-Motion>", update_rectangle)
# 创建“裁剪”按钮
crop_button = tk.Button(crop_window, text="Crop", command=lambda: crop_and_save_image(image, rect))
crop_button.pack()
“`
6. 定义裁剪并保存图像功能
“`python
def cropandsaveimage(image, rect):
# 获取矩形选择器的坐标并裁剪图像
left, top, right, bottom = canvas.coords(rect)
croppedimage = image.crop((left, top, right, bottom))
# 保存图像
filename = filedialog.asksaveasfilename(
title="Save Cropped Image",
filetypes=(("All Images", "*.*"), ("PNG", "*.png"), ("JPEG", "*.jpg"), ("BMP", "*.bmp"))
)
if filename:
cropped_image.save(filename)
“`
7. 创建菜单栏
“`python
menubar = tk.Menu(root)
root.config(menu=menubar)
filemenu = tk.Menu(menubar, tearoff=False)
filemenu.addcommand(label=”Open”, command=openimage)
filemenu.addseparator()
filemenu.addcommand(label=”Save”, command=saveimage)
filemenu.addcommand(label=”Crop”, command=cropimage)
filemenu.addseparator()
filemenu.addcommand(label=”Exit”, command=exit)
viewmenu = tk.Menu(menubar, tearoff=False)
viewmenu.addcommand(label=”Zoom In”, command=zoomin)
viewmenu.addcommand(label=”Zoom Out”, command=zoom_out)
menubar.addcascade(label=”File”, menu=filemenu)
menubar.addcascade(label=”View”, menu=viewmenu)
“`
完整代码
“`
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
root = tk.Tk()
root.title(“Image Viewer”)
def open_image():
filename = filedialog.askopenfilename(
title=”Select an Image”,
filetypes=((“All Images”, “.“), (“PNG”, “.png”), (“JPEG”, “.jpg”), (“BMP”, “*.bmp”))
)
if filename:
image = Image.open(filename)
image.thumbnail((root.winfo_width(), root.winfo_height()))
image_tk = ImageTk.PhotoImage(image)
label = tk.Label(root, image=image_tk)
label.pack()
def zoom_in():
image = label.image
image.thumbnail((image.width() * 1.2, image.height() * 1.2))
image_tk = ImageTk.PhotoImage(image)
label.configure(image=image_tk)
def zoom_out():
image = label.image
image.thumbnail((image.width() / 1.2, image.height() / 1.2))
image_tk = ImageTk.PhotoImage(image)
label.configure(image=image_tk)
def crop_image():
image = label.image
crop_window = tk.Toplevel(root)
crop_window.title("Crop Image")
canvas = tk.Canvas(crop_window, width=image.width(), height=image.height())
canvas.pack()
rect = canvas.create_rectangle(0, 0, 100, 100)
def update_rectangle(event):
rect.coords(event.x, event.y, event.x + 1, event.y + 1)
canvas.bind("<B1-Motion>", update_rectangle)
crop_button = tk.Button(crop_window, text="Crop", command=lambda: crop_and_save_image(image, rect))
crop_button.pack()
def cropandsaveimage(image, rect):
left, top, right, bottom = canvas.coords(rect)
croppedimage = image.crop((left, top, right, bottom))
filename = filedialog.asksaveasfilename(
title="Save Cropped Image",
filetypes=(("All Images", "*.*"), ("PNG", "*.png"), ("JPEG", "*.jpg"), ("BMP", "*.bmp"))
)
if filename:
cropped_image.save(filename)
menubar = tk.Menu(root)
root.config(menu=menubar)
filemenu = tk.Menu(menubar, tearoff=False)
filemenu.addcommand(label=”Open”, command=openimage)
filemenu.addseparator()
filemenu.addcommand(label=”Save”, command=saveimage)
filemenu.addcommand(label=”Crop”, command=cropimage)
filemenu.addseparator()
filemenu.addcommand(label=”Exit”, command=exit)
viewmenu = tk.Menu(menubar, tearoff=False)
viewmenu.addcommand(label=”Zoom In”, command=zoomin)
viewmenu.addcommand(label=”Zoom Out”, command=zoom_out)
menubar.addcascade(label=”File”, menu=filemenu)
menubar.addcascade(label=”View”, menu=viewmenu)
root.mainloop()
“`
问答
1. 如何打开一个图像?
使用 filedialog.askopenfilename()
函数,允许用户选择一个图像文件。
2. 如何缩放图像?
使用 `
原创文章,作者:施峰晴,如若转载,请注明出处:https://www.wanglitou.cn/article_129474.html