c:\pythoncode\new\cropimageandsave.py
功能特性
图片加载:支持加载 jpg 和 png 格式的图片。
动态裁剪:通过鼠标绘制矩形选择框进行裁剪。
缩放适配:图片会根据面板大小自动缩放显示。
保存裁剪结果:裁剪后的图片可以保存为 png 文件。
代码实现
完整代码如下:
import wx
import os
from pil import image
class imagecropperframe(wx.frame):
def __init__(self):
super().__init__(parent=none, title='图片裁剪工具', size=(800, 600))
self.init_ui()
def init_ui(self):
# 创建菜单栏
menubar = wx.menubar()
file_menu = wx.menu()
open_item = file_menu.append(wx.id_open, '打开图片', '打开一个图片文件')
menubar.append(file_menu, '文件')
self.setmenubar(menubar)
# 创建面板和图片显示控件
self.panel = wx.panel(self)
self.image_panel = wx.panel(self.panel)
self.image_panel.setbackgroundcolour(wx.colour(200, 200, 200))
# 初始化变量
self.image = none
self.bitmap = none
self.start_pos = none
self.current_pos = none
self.is_drawing = false
# 设置布局
sizer = wx.boxsizer(wx.vertical)
sizer.add(self.image_panel, 1, wx.expand)
self.panel.setsizer(sizer)
# 绑定事件
self.bind(wx.evt_menu, self.on_open, open_item)
self.image_panel.bind(wx.evt_paint, self.on_paint)
self.image_panel.bind(wx.evt_left_down, self.on_left_down)
self.image_panel.bind(wx.evt_left_up, self.on_left_up)
self.image_panel.bind(wx.evt_motion, self.on_motion)
def on_open(self, event):
# 打开文件对话框
with wx.filedialog(self, "选择图片文件",
wildcard="图片文件 (*.jpg;*.jpeg;*.png)|*.jpg;*.jpeg;*.png",
style=wx.fd_open | wx.fd_file_must_exist) as filedialog:
if filedialog.showmodal() == wx.id_cancel:
return
# 加载图片
pathname = filedialog.getpath()
self.load_image(pathname)
self.image_path = pathname
def load_image(self, path):
# 使用pil加载图片
self.pil_image = image.open(path)
# 转换为wx.bitmap
self.image = wx.image(path, wx.bitmap_type_any)
# 调整图片大小以适应窗口
self.scale_image()
self.refresh()
def scale_image(self):
# 获取面板大小
panel_size = self.image_panel.getsize()
# 计算缩放比例
width_ratio = panel_size.width / self.image.getwidth()
height_ratio = panel_size.height / self.image.getheight()
scale = min(width_ratio, height_ratio)
# 缩放图片
new_width = int(self.image.getwidth() * scale)
new_height = int(self.image.getheight() * scale)
self.image = self.image.scale(new_width, new_height)
self.bitmap = wx.bitmap(self.image)
# 保存缩放比例用于裁剪
self.scale_factor = scale
def on_paint(self, event):
dc = wx.paintdc(self.image_panel)
if self.bitmap:
dc.drawbitmap(self.bitmap, 0, 0)
# 绘制选择框
if self.start_pos and self.current_pos:
dc.setpen(wx.pen(wx.red, 1, wx.penstyle_dot))
dc.setbrush(wx.transparent_brush)
x = min(self.start_pos[0], self.current_pos[0])
y = min(self.start_pos[1], self.current_pos[1])
w = abs(self.current_pos[0] - self.start_pos[0])
h = abs(self.current_pos[1] - self.start_pos[1])
dc.drawrectangle(x, y, w, h)
def on_left_down(self, event):
self.start_pos = event.getposition()
self.current_pos = self.start_pos
self.is_drawing = true
def on_motion(self, event):
if self.is_drawing:
self.current_pos = event.getposition()
self.refresh()
def on_left_up(self, event):
if self.is_drawing:
self.is_drawing = false
# 获取选择区域
x1 = min(self.start_pos[0], self.current_pos[0])
y1 = min(self.start_pos[1], self.current_pos[1])
x2 = max(self.start_pos[0], self.current_pos[0])
y2 = max(self.start_pos[1], self.current_pos[1])
# 转换回原始图片坐标
orig_x1 = int(x1 / self.scale_factor)
orig_y1 = int(y1 / self.scale_factor)
orig_x2 = int(x2 / self.scale_factor)
orig_y2 = int(y2 / self.scale_factor)
# 裁剪图片
cropped = self.pil_image.crop((orig_x1, orig_y1, orig_x2, orig_y2))
# 生成保存路径
directory = os.path.dirname(self.image_path)
filename = os.path.splitext(os.path.basename(self.image_path))[0]
save_path = os.path.join(directory, f"{filename}_cropped.png")
# 保存裁剪后的图片
cropped.save(save_path)
# 显示成功消息
wx.messagebox(f"裁剪后的图片已保存至:\n{save_path}",
"保存成功",
wx.ok | wx.icon_information)
# 重置选择区域
self.start_pos = none
self.current_pos = none
self.refresh()
if __name__ == '__main__':
app = wx.app()
frame = imagecropperframe()
frame.show()
app.mainloop()核心实现
图片加载与缩放
使用 pil.image 加载图片,并通过 wx.image 将其转换为适配 wxpython 的格式。同时,通过计算缩放比例,确保图片适配显示区域。
绘制矩形选择框
利用 wx.paintdc 绘制矩形选择框,在鼠标事件(按下、移动、释放)中动态更新选择框。
裁剪与保存
通过 pil.image.crop 方法,根据用户选择的区域裁剪图片,并自动生成裁剪后的文件路径进行保存。
运行结果


总结
此工具简单实用,能够快速完成图片裁剪任务。您可以根据实际需求进一步扩展,例如添加更多格式支持或多图片批量裁剪功能。欢迎尝试并提出您的建议!
到此这篇关于python使用pil构建图片裁剪工具的实现步骤的文章就介绍到这了,更多相关python pil图片裁剪工具内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论