2010-11-20 9 views
0

Imagemagickを使用してQtに画像をロードしてから 画像にさまざまな操作(ぼかし、白黒、レベルなど)を実行するウィジェットがいくつかあります。イメージが操作されるたびにエンドユーザーに表示されるイメージプレビューがあります。Qtに画像のプレビューを表示するには?

私が持っている問題は、例えば、私は(水平スライダーを使用して)、いくつかのぼかし効果を適用した場合、私はオブジェクトが既に操作されるようにそれを削除することができる習慣ということです。ここで

が機能

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

私はあなたのイメージの状態の行を保持する必要があると思う(新しい効果が適用された後、新しい状態 - イメージのコピーを作成する必要があります)。必要に応じてロールバックするだけで済みます。リスト構造はこの目的のために良いでしょう。このようなアプローチを使用すると、ロールバックするだけでなく、元に戻すREDOシステムを完全に実装することができます。

イメージに新しいエフェクトを適用する場合は、新しいコピーを作成して使用します。エフェクトが作成された場合は、キャンセルされた場合は状態リストに入れます。 QImageをコピーするには、コピーメソッドを使用します。

プレビューを表示するには、画像のサイズを変更して表示するだけです。

PS:結果(効果がスケーリングされていない画像に適用される)、最終的な結果は異なることができるので、プレビューに直接効果を適用することは良い考えではありません。

EDIT: また、画像の一部(ブラシストロークなど)に適用される小さなエフェクトの保存状態を最適化することも可能だと思います。そのような状況では、実際には、ストロークが適用された画像の一部だけを保存する必要があります。たとえば、あなたのニーズを実装するためにアンドゥ/リドゥができるようになりますStateManagerとして何か、Stateクラス(状態のための基本的なクラス)と、いくつかの州のサブクラスを作成することができます。すべての画像に適用する効果を保存するためのCompleteState : State、およびのためのPartState : Stateをパーツに適用されるエフェクト。

+0

偉大な助言アンドリューしかし私はスライダーを使用して私は言った。シナリオを想定します。私はイメージをロードし、私は50が大きすぎると判断した場合、私は25に戻ってそれを取りたいですか?画像オブジェクトで何をしますか?ありがとうございました! – Sharethefun

+0

新しいエフェクトを作成するときに、イメージのコピーを作成します。だからちょうどあなたのイメージ(元とコピー)の2つのコピーを持っています。スライダの各ステップでは、最後の状態(元のイメージ)からコピーを再作成または更新し、それにエフェクトを適用する(コピーする)必要があります。私はこれが唯一の方法だと思います。なぜなら、効果を正しく適用するためには、常に鮮明な画像を持つべきだからです。 – Andrew

関連する問題