如何在qt中显示图像的预览?

时间:2010-11-20 19:04:53

标签: c++ qt qt4 imagemagick

我使用Imagemagick将图像加载到qt然后 我有几个小部件,可以对图像执行各种操作(模糊,黑白,水平等)。每次操作图像时都会向最终用户显示图像预览。

我遇到的问题是,如果我应用一些模糊效果(使用horizo​​ntalSlider),我将无法删除它,因为对象已被操纵。

这是我与函数的连接

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专家!

1 个答案:

答案 0 :(得分:2)

我认为你应该保留一行图像状态(在应用新效果后,你应该创建一个新状态 - 图像的副本)。所以你可以根据需要简单回滚。列表结构将有利于此目的。使用这种方法,您不仅可以回滚,还可以完全实现undo-redo系统。

如果要对图像应用新效果,请制作新副本并使用它。如果创建效果将其置于状态列表中,如果取消 - 删除。要复制QImage,请使用它的复制方法。

要显示预览,只需调整图像大小并显示即可。

PS:将效果直接应用于预览不是一个好主意,因为结果可能与最终结果不同(当效果应用于未缩放的图像时)。

修改 此外,我认为可以优化小效果的保存状态,应用于图像的一部分(如画笔描边)。在这种情况下,你真的需要只保存图像的一部分,应用笔划的位置。例如,你可以创建一个StateManager的东西,它将知道如何做撤消/重做,State类(状态的基本类)和一些State子类来实现你的需求:CompleteState : State for保存应用于所有图像的效果,PartState : State表示应用于部件的效果。