我使用Imagemagick将图像加载到qt然后 我有几个小部件,可以对图像执行各种操作(模糊,黑白,水平等)。每次操作图像时都会向最终用户显示图像预览。
我遇到的问题是,如果我应用一些模糊效果(使用horizontalSlider),我将无法删除它,因为对象已被操纵。
这是我与函数的连接
connect(ui->horizontalSlider_blur, SIGNAL(actionTriggered(int)), this, SLOT(blur(double,int)));
以下是我如何应用效果并更新标签以显示我的图像
void MainWindow::blur(double factor, int pixels)
{
image.blur(pixels,factor);
image.write(&blob);
imgData = ((char*)(blob.data()));
pixmap.loadFromData(imgData, "XPM");
ui->label->setPixmap( pixmap );
}
每次应用效果时复制图像对象都是个好主意吗? 如果是的话,我该怎么做?
操作图像并动态显示其预览的最佳做法是什么?
来自Qt专家!
答案 0 :(得分:2)
我认为你应该保留一行图像状态(在应用新效果后,你应该创建一个新状态 - 图像的副本)。所以你可以根据需要简单回滚。列表结构将有利于此目的。使用这种方法,您不仅可以回滚,还可以完全实现undo-redo系统。
如果要对图像应用新效果,请制作新副本并使用它。如果创建效果将其置于状态列表中,如果取消 - 删除。要复制QImage,请使用它的复制方法。
要显示预览,只需调整图像大小并显示即可。
PS:将效果直接应用于预览不是一个好主意,因为结果可能与最终结果不同(当效果应用于未缩放的图像时)。
修改强>
此外,我认为可以优化小效果的保存状态,应用于图像的一部分(如画笔描边)。在这种情况下,你真的需要只保存图像的一部分,应用笔划的位置。例如,你可以创建一个StateManager
的东西,它将知道如何做撤消/重做,State
类(状态的基本类)和一些State子类来实现你的需求:CompleteState : State
for保存应用于所有图像的效果,PartState : State
表示应用于部件的效果。