在cv4.x以上版本中,利用python和openCV制作一个图像编辑软件,需要有菜单栏和工具栏,工具栏需要有按钮,输入框输入数据参与图像的编辑,可以从外部选取图片文件,可以保存文件。请给出代码示例
时间: 2024-03-26 20:36:23 浏览: 143
以下是一个使用Python和OpenCV制作图像编辑器的简单示例代码:
```python
import cv2
import numpy as np
from tkinter import *
from tkinter import filedialog
class ImageEditor:
def __init__(self, master):
self.master = master
self.master.title("图像编辑器")
# 创建菜单栏
menubar = Menu(self.master)
self.master.config(menu=menubar)
# 创建文件菜单
filemenu = Menu(menubar)
menubar.add_cascade(label="文件", menu=filemenu)
filemenu.add_command(label="打开", command=self.open_image)
filemenu.add_command(label="保存", command=self.save_image)
# 创建工具栏
toolbar = Frame(self.master)
toolbar.pack(side=TOP, fill=X)
# 添加旋转工具
rotate_label = Label(toolbar, text="旋转角度:")
rotate_label.pack(side=LEFT, padx=2, pady=2)
self.rotate_entry = Entry(toolbar)
self.rotate_entry.pack(side=LEFT, padx=2, pady=2)
rotate_button = Button(toolbar, text="旋转", command=self.rotate_image)
rotate_button.pack(side=LEFT, padx=2, pady=2)
# 添加翻转工具
flip_button = Button(toolbar, text="翻转", command=self.flip_image)
flip_button.pack(side=LEFT, padx=2, pady=2)
# 添加裁剪工具
crop_label = Label(toolbar, text="裁剪区域:")
crop_label.pack(side=LEFT, padx=2, pady=2)
self.crop_entry = Entry(toolbar)
self.crop_entry.pack(side=LEFT, padx=2, pady=2)
crop_button = Button(toolbar, text="裁剪", command=self.crop_image)
crop_button.pack(side=LEFT, padx=2, pady=2)
# 创建画布
self.canvas = Canvas(self.master, width=800, height=600)
self.canvas.pack()
# 初始化图像
self.image = None
self.image_copy = None
def open_image(self):
# 打开图片文件
file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.jpg;*.jpeg;*.png")])
# 读取图片并显示
self.image = cv2.imread(file_path)
self.image_copy = self.image.copy()
self.show_image()
def save_image(self):
# 保存图像文件
file_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("Image Files", "*.png")])
cv2.imwrite(file_path, self.image)
def show_image(self):
# 将OpenCV图像转换为Tkinter图像并显示
image = cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB)
image = Image.fromarray(image)
self.photo = ImageTk.PhotoImage(image)
self.canvas.create_image(0, 0, image=self.photo, anchor=NW)
def rotate_image(self):
# 获取旋转角度并进行旋转
angle = float(self.rotate_entry.get())
rows, cols, _ = self.image.shape
M = cv2.getRotationMatrix2D((cols/2, rows/2), angle, 1)
self.image = cv2.warpAffine(self.image_copy, M, (cols, rows))
self.show_image()
def flip_image(self):
# 进行水平翻转
self.image = cv2.flip(self.image_copy, 1)
self.show_image()
def crop_image(self):
# 获取裁剪区域并进行裁剪
x, y, w, h = map(int, self.crop_entry.get().split(","))
self.image = self.image_copy[y:y+h, x:x+w]
self.show_image()
if __name__ == '__main__':
root = Tk()
app = ImageEditor(root)
root.mainloop()
```
上面的代码中,我们使用了Tkinter库创建图形界面,并将OpenCV图像转换为Tkinter图像进行显示。通过菜单栏和工具栏提供了打开、保存、旋转、翻转、裁剪等功能。用户可以通过输入框输入旋转角度和裁剪区域。在每个工具的回调函数中,根据用户输入调用OpenCV库中相应的函数进行图像处理,并将处理后的图像重新显示在画布上。
阅读全文