2010-11-20 5 views
0

Je charge une image à qt en utilisant Imagemagick puis J'ai plusieurs widgets qui effectuent différentes actions sur une image (flou, noir et blanc, niveaux etc). Il y a un aperçu d'image que je montre à l'utilisateur final chaque fois que l'image est manipulée. Le problème que j'ai est que si par exemple j'applique quelques effets de flou (en utilisant horizontalSlider), je ne serai pas capable de l'enlever car l'objet est déjà manipulé.Comment afficher un aperçu d'une image en qt?

Voici ma connexion à la fonction

connect(ui->horizontalSlider_blur, SIGNAL(actionTriggered(int)), this, SLOT(blur(double,int))); 

et voici comment j'appliquer des effets et mettre à jour l'étiquette pour afficher mon image

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); 
} 

aura-t-il une bonne idée de copier l'objet d'image chaque fois que j'applique des effets? si oui, comment je fais ça?

Quelles sont les meilleures pratiques pour manipuler l'image et afficher son aperçu dynamiquement?

venez sur les experts Qt!

Répondre

2

Je pense que vous devriez garder une ligne de vos états d'image (après qu'un nouvel effet est appliqué, vous devriez créer un nouvel état - une copie d'une image). Vous pouvez donc simplement revenir en arrière si vous en avez besoin. Une structure de liste sera bonne à cet effet. En utilisant une telle approche, vous pouvez non seulement revenir en arrière, mais implémenter complètement le système Undo-redo.

Lorsque vous souhaitez appliquer un nouvel effet à votre image - créez une nouvelle copie et travaillez avec. Si l'effet est créé, mettez-le dans une liste d'état, s'il est annulé - supprimez. Pour copier un QImage, utilisez sa méthode de copie.

Pour afficher un aperçu, redimensionnez simplement une image et affichez-la. PS: ce n'est pas une bonne idée d'appliquer un effet directement à un aperçu car le résultat peut différer du résultat final (lorsque l'effet est appliqué à une image non-calibrée).

EDIT: Je pense aussi qu'il est possible d'optimiser des états d'économie pour les petits effets, appliqué à une partie de l'image (comme coup de pinceau). Dans une telle situation, vous avez vraiment besoin de sauvegarder seulement la partie de l'image, où le coup a été appliqué. Par exemple, vous pouvez créer quelque chose comme StateManager qui saura comment faire défaire/refaire, State classe (classe de base pour les états) et certaines sous-classes d'état pour implémenter vos besoins: CompleteState : State pour enregistrer un effet appliqué à toute l'image, et PartState : State pour un effet appliqué à une pièce.

+0

Grand conseiller Andrew mais j'ai dit Im en utilisant des curseurs. Supposons un scénario. Je charge une image et Im applique un effet de flou à travers le curseur en tirant le curseur de 0 à 50 et si je décide que 50 est trop et je veux le ramener à 25? que vais-je faire avec l'objet image? Je vous remercie! – Sharethefun

+0

Regardez, quand vous allez créer un nouvel effet, vous faites une copie de votre image. Donc exactement vous avez deux copies de votre image (original et une copie). À chaque étape d'un curseur, vous devez recréer ou mettre à jour la copie à partir du dernier état (image originale) et lui appliquer un effet (copie). Je pense que c'est le seul moyen, car pour appliquer l'effet correctement, vous devriez toujours avoir l'image claire. – Andrew