一.效果
二.原理
对于截图类工具,虽然有撤销功能,但是画图形、写文字等操作应该不是在原图上直接操作的。通常的做法有两种,一是在原图窗口上覆盖一层透明的窗口,所有的操作都在这层透明窗口上进行,最终保存的时候将透明窗口上的图形和原图合并成一张图片;二是直接在原图上覆盖一层和原图一样的窗口,直接在新窗口上对图片进行操作,最终直接保存新窗口的图片即可。本文使用方法二。
马赛克的原理是,将窗口等分成相同大小的正方形小块,正方形的宽度可以自定义,比如10像素,当鼠标滑动时,计算当前鼠标位置对应小块的左上角顶点,然后取出该顶点在图片中对应的颜色值(因为这里是直接在图片上操作,所以需要事先copy一份图片用于取色),当然这里直接取左上角顶点的颜色值比较暴力,更好的做法是计算小块的颜色均值。
撤销和重做的原理是,从鼠标按下到释放算是一次操作,鼠标释放时将图片压栈,撤销时将图片出栈,并将出栈的图片压入重做列表中......
三.实现
#include "QHMosaic.h"
#include <QPainter>
#include <QCursor>
#include <QDebug>
QHMosaic::QHMosaic(QWidget *parent)
: QWidget(parent)
, m_mosaicChunkSize(10)
{
m_