login
Python图片取样笔编辑器
2025/09/02·StepFun can make mistakes, check important info.
用python编写一个编辑图片的取样笔功能的程序,程序有图形界面,取样笔功能是:在图片里鼠标点击选择一个样例区域,区域手圆形的,圆形半径可以自由设置,默认值是30,然后点击鼠标在图像上涂抹使得涂抹区域的像素值跟样例区域的像素值相同。程序能打开一个文件夹,假设文件夹里有n对图片,每一对图片名称是n_rgb.jpg,n_depth.png这种形式的,每次在界面上显示n_rgb.jpg和n_depth.png这两张图,其中n_rgb.jpg在界面上方n_depth.png在界面下方,然后编辑n_depth.png图片,编辑完成后保存n_depth.png图片,有自动保存功能,默认是自动保存的。取样笔功能参考美图秀秀里的,可以放大查看n_rgb.jpg和n_depth.png图片,用pyqt实现
Reason
思考过程

我们使用PyQt5来实现这个图片编辑器,因为PyQt5提供了更丰富的图形界面组件和更好的缩放功能。
功能要求:

  1. 界面分为上下两部分,上方显示n_rgb.jpg,下方显示n_depth.png。
  2. 取样笔功能:在深度图上点击选择圆形样本区域(默认半径30),然后拖动鼠标将样本区域复制到目标位置。
  3. 支持放大查看图片(使用鼠标滚轮缩放)。
  4. 自动保存功能,默认开启。
  5. 可以浏览文件夹中的多对图片(假设有n对,命名从1到n)。

我们将使用QGraphicsView和QGraphicsPixmapItem来显示图片,这样可以方便地实现缩放和拖动查看。

步骤:

  1. 创建主窗口,包含两个图形视图(上方RGB,下方Depth)。
  2. 实现打开文件夹功能,加载图片对。
  3. 实现取样笔功能:在深度图上点击设置样本区域(圆形),拖动时将样本区域复制到目标位置。
  4. 实现图片切换功能(上一张、下一张)。
  5. 实现自动保存和手动保存。
  6. 添加状态栏显示操作信息。

注意:由于美图秀秀的取样笔是取色后涂抹,我们这里则是复制整个圆形区域(包括颜色和透明度)。

我们将使用QPainter和QImage来处理图片。

由于需要编辑深度图,我们将深度图加载到QImage中,然后在前景显示一个可操作的图形项,实现取样和涂抹。

考虑到性能,我们不会实时显示涂抹效果,而是当鼠标释放时应用所有操作(或者可以设置定时器批量应用)。

但为了简单起见,我们采用直接修改QImage并在每次操作后更新显示的方式。

对于放大功能,我们将使用QGraphicsView的setMatrix方法,并响应鼠标滚轮事件。

由于要求较多,我们将分步骤实现:

  1. 创建主窗口和图形视图。
  2. 实现图片加载和显示。
  3. 实现取样笔功能(包括设置样本区域和涂抹)。
  4. 实现图片导航(上一张、下一张)。
  5. 实现自动保存。

注意:由于我们编辑的是深度图,所以每次编辑后(或自动保存时)要保存深度图文件。

我们将使用以下命名:

  • 上方视图:rgbView
  • 下方视图:depthView
  • 上方图形项:rgbPixmapItem
  • 下方图形项:depthPixmapItem(这个将是可编辑的,我们会在其之上叠加一个透明的可绘制区域)

但是,为了能够放大查看,我们需要将两个图片都放在QGraphicsScene中,并显示在QGraphicsView中。

取样笔的实现思路:

  • 当在深度图上点击时,记录点击位置,并以该点为中心取一个圆形区域作为样本(半径可调)。
  • 当鼠标移动时,在鼠标位置绘制一个圆形(作为涂抹区域),并将样本图像复制到该区域。
  • 由于直接复制图像可能会造成性能问题,我们可以使用双缓冲:在内存中维护一个深度图的副本,然后定期更新显示。

但是,为了实时性,我们将在鼠标移动时更新显示,但注意大图片可能会卡顿。

我们采用的方式:

  • 使用一个QImage作为深度图的工作副本,每次启动编辑时从文件加载,保存时写回。
  • 在depthView中,我们将显示这个工作副本的QGraphicsPixmapItem。
  • 当取样笔操作时,我们直接修改这个QImage,并更新显示(通过更新图形项)。

为了支持放大,我们使用QGraphicsView的缩放,但是注意:图形项的坐标是场景坐标,而鼠标事件需要转换。

步骤:

  1. 创建主窗口,包含两个QGraphicsView,并设置它们的场景。
  2. 状态栏显示信息。
  3. 打开文件夹:获取所有图片对,加载当前图片对。
  4. 在深度图场景中,除了显示深度图的图形项,还要有一个覆盖整个场景的透明图形项,用于接收鼠标事件。
  5. 鼠标按下事件:记录样本区域(在深度图工作副本中取圆形的样本图像)。
  6. 鼠标移动事件:如果正在取样,则在鼠标位置应用样本图像(将深度图工作副本中对应圆形区域替换为样本图像)。
  7. 鼠标释放事件:结束取样。
  8. 缩放:通过鼠标滚轮事件,调整视图的缩放因子。

由于时间关系,我们只实现基本功能,并尽量保持代码清晰。

注意:自动保存功能,我们可以在每次编辑操作后(比如鼠标释放时)自动保存,或者定时保存。这里我们在每次编辑操作后(鼠标释放时)保存。

但是,如果图片很大,频繁保存可能会影响性能。因此,我们也可以提供手动保存按钮,并默认开启自动保存(但可以关闭)。

我们添加一个自动保存的复选框。

由于要求使用PyQt,我们使用PyQt5。

安装:pip install PyQt5

代码结构:

class ImageEditor(QMainWindow)
- 初始化UI
- 打开文件夹
- 加载图片
- 上一张/下一张
- 保存深度图
- 取样笔功能
- 缩放功能

我们开始编写代码。

图片取样笔编辑器 (PyQt5实现)

下面是一个使用PyQt5实现的图片编辑器,具有取样笔功能,可以打开文件夹并编辑深度图片:

python

功能说明

这个图片编辑器具有以下功能:

  1. 文件夹加载

    • 支持打开包含成对图片的文件夹(1_rgb.jpg, 1_depth.png, ..., 100_rgb.jpg, 100_depth.png)
    • 自动验证文件夹结构
  2. 双图显示

    • 上方显示RGB图片(只读)
    • 下方显示深度图片(可编辑)
  3. 取样笔功能

    • 在深度图上点击选择圆形样本区域(默认半径30像素)
    • 拖动鼠标将样本区域复制到目标位置
    • 支持调整取样半径(5-100像素)
    • 支持多种颜色选择(红、绿、蓝、黑、白、黄)
  4. 图片导航

    • 上一张/下一张按钮浏览图片
    • 自动保存当前编辑的图片
    • 状态栏显示当前图片信息
  5. 图片查看功能

    • 鼠标滚轮缩放图片
    • 右键菜单提供放大、缩小、重置缩放功能
    • 支持键盘快捷键(+/-缩放,Z撤销,Y重做)
  6. 自动保存

    • 默认开启自动保存模式
    • 可手动保存或切换图片
    • 退出时提示保存所有更改

使用说明

  1. 运行程序后,点击"打开文件夹"选择包含图片对的文件夹
  2. 在深度图片上点击选择样本区域(黄色圆圈)
  3. 按住鼠标拖动,将样本区域复制到目标位置
  4. 使用顶部控件调整取样半径和颜色
  5. 使用"上一张"和"下一张"按钮浏览和编辑其他图片
  6. 编辑过程中自动保存,也可点击"保存"按钮手动保存

环境要求

需要安装PyQt5库:

text

这个编辑器提供了类似美图秀秀的取样笔功能,支持放大查看图片,并具有自动保存功能,非常适合处理成对的RGB和深度图片。