导入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()

wxPython 图片处理示例:缩放、旋转和移动

原文地址: https://www.cveoy.top/t/topic/ohjA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录