2010-11-20 268 views
0

我使用Imagemagick将图像加载到qt,然后 我有几个小部件对图像执行各种操作(模糊,黑白,水平等)。每当图像被操纵时,我都会向最终用户展示图像预览。如何在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专家!

回答

2

我认为你应该保留一行图像状态(应用新效果后,你应该创建一个新状态 - 图像的副本)。所以你可以简单地回滚,如果你需要。列表结构对于这个目的是很好的。使用这种方法不仅可以回滚,而且可以完全实现撤销 - 重做系统。

当您想要将新的效果应用于图像时 - 制作新副本并使用它。如果创建效果,则将其置于状态列表中,如果取消 - 移除。复制一个QImage使用它的复制方法。

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

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

编辑: 此外,我认为这是可以优化节省状态对小的效果,适用于图像(如笔触)的一部分。在这种情况下,您只需要保存图像的部分,已经应用了笔划的位置。例如,您可以创建一些东西,如StateManager,它将知道如何执行撤消/重做,State类(州的基本类)和一些州子类来实现您的需求:CompleteState : State用于保存应用于所有图像的效果,PartState : State用于应用于零件的效果。

+0

伟大的advnice安德鲁,但我说我使用滑块。让我们假设一个场景。我加载一个图像,并通过拉动滑块从0到50应用模糊效果通过滑块如果我决定50是太多,我想把它回到25?我将如何处理图像对象?谢谢! – Sharethefun 2010-11-21 00:56:54

+0

看,当你要创建一个新的效果时,你会复制图像。正好你有两份你的图片(原件和副本)。在滑块的每一步上,您应该重新创建或更新最后一个状态(原始图像)的副本并对其应用效果(副本)。我认为这是唯一的方法,因为正确应用效果,您应该始终拥有清晰的图像。 – Andrew 2010-11-21 09:16:17

相关问题