wxPython 图片处理示例:缩放、旋转和移动
导入wxpython库
import wx
定义一个继承了Panel的MyPanel类
class MyPanel(wx.Panel): def init(self, parent): super().init(parent)
# 加载背景图片
self.bg = wx.Bitmap('bg.png')
# 加载小图片
self.b = wx.Bitmap('b.png')
# 初始化b的位置和大小
self.b_x = 100
self.b_y = 100
self.b_width = self.b.GetWidth()
self.b_height = self.b.GetHeight()
# 定义虚线框和圆圈的颜色
self.pen_color = wx.Colour(255, 0, 0)
# 定义虚线框和圆圈的大小
self.pen_size = 1
# 定义虚线框和圆圈的样式
self.pen_style = wx.PENSTYLE_LONG_DASH
# 定义鼠标状态
self.mouse_down = False
self.mouse_x = 0
self.mouse_y = 0
# 设置Panel的尺寸
self.SetSize(self.bg.GetWidth(), self.bg.GetHeight())
# 绑定事件
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown)
self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp)
self.Bind(wx.EVT_MOTION, self.OnMouseMove)
# 绘制函数
def OnPaint(self, event):
dc = wx.AutoBufferedPaintDC(self)
# 绘制背景图片
dc.DrawBitmap(self.bg, 0, 0)
# 绘制小图片
dc.DrawBitmap(self.b, self.b_x, self.b_y)
# 如果鼠标按下并且在小图片范围内,绘制虚线框和圆圈
if self.mouse_down and self.mouse_x >= self.b_x and self.mouse_x <= self.b_x + self.b_width and self.mouse_y >= self.b_y and self.mouse_y <= self.b_y + self.b_height:
pen = wx.Pen(self.pen_color, self.pen_size, self.pen_style)
dc.SetPen(pen)
# 绘制虚线框
dc.DrawRectangle(self.b_x, self.b_y, self.b_width, self.b_height)
# 绘制四个圆圈
dc.DrawCircle(self.b_x, self.b_y, 5)
dc.DrawCircle(self.b_x + self.b_width, self.b_y, 5)
dc.DrawCircle(self.b_x, self.b_y + self.b_height, 5)
dc.DrawCircle(self.b_x + self.b_width, self.b_y + self.b_height, 5)
# 鼠标按下事件
def OnMouseDown(self, event):
self.mouse_down = True
self.mouse_x, self.mouse_y = event.GetPosition()
# 鼠标抬起事件
def OnMouseUp(self, event):
self.mouse_down = False
# 鼠标移动事件
def OnMouseMove(self, event):
if self.mouse_down:
x, y = event.GetPosition()
dx = x - self.mouse_x
dy = y - self.mouse_y
# 如果鼠标在小图片的四个角,旋转小图片
if x >= self.b_x and x <= self.b_x + self.pen_size and y >= self.b_y and y <= self.b_y + self.pen_size:
self.b = self.b.Rotate90(clockwise=False)
self.b_width, self.b_height = self.b_height, self.b_width
self.b_x -= self.b_width - self.b_height
self.b_y -= self.b_height - self.b_width
elif x >= self.b_x + self.b_width - self.pen_size and x <= self.b_x + self.b_width and y >= self.b_y and y <= self.b_y + self.pen_size:
self.b = self.b.Rotate90(clockwise=True)
self.b_width, self.b_height = self.b_height, self.b_width
self.b_y -= self.b_height - self.b_width
elif x >= self.b_x and x <= self.b_x + self.pen_size and y >= self.b_y + self.b_height - self.pen_size and y <= self.b_y + self.b_height:
self.b = self.b.Rotate90(clockwise=True)
self.b_width, self.b_height = self.b_height, self.b_width
self.b_x -= self.b_width - self.b_height
elif x >= self.b_x + self.b_width - self.pen_size and x <= self.b_x + self.b_width and y >= self.b_y + self.b_height - self.pen_size and y <= self.b_y + self.b_height:
self.b = self.b.Rotate90(clockwise=False)
self.b_width, self.b_height = self.b_height, self.b_width
# 如果鼠标在小图片的四周,缩放小图片
elif x >= self.b_x and x <= self.b_x + self.b_width and y >= self.b_y - self.pen_size and y <= self.b_y + self.pen_size:
self.b_height -= dy
self.b_y += dy
elif x >= self.b_x and x <= self.b_x + self.b_width and y >= self.b_y + self.b_height - self.pen_size and y <= self.b_y + self.b_height + self.pen_size:
self.b_height += dy
elif x >= self.b_x - self.pen_size and x <= self.b_x + self.pen_size and y >= self.b_y and y <= self.b_y + self.b_height:
self.b_width -= dx
self.b_x += dx
elif x >= self.b_x + self.b_width - self.pen_size and x <= self.b_x + self.b_width + self.pen_size and y >= self.b_y and y <= self.b_y + self.b_height:
self.b_width += dx
# 更新鼠标位置
self.mouse_x, self.mouse_y = x, y
# 重新绘制Panel
self.Refresh()
定义一个继承了Frame的MyFrame类
class MyFrame(wx.Frame): def init(self): super().init(None, title='图片处理', size=(800, 600))
# 添加MyPanel到Frame
self.panel = MyPanel(self)
# 显示Frame
self.Show()
启动主程序
if name == 'main': app = wx.App() frame = MyFrame() app.MainLoop()
原文地址: https://www.cveoy.top/t/topic/ohjA 著作权归作者所有。请勿转载和采集!