Как отобразить предпросмотр изображения в qt? - PullRequest
1 голос
/ 20 ноября 2010

Я загружаю изображение в qt, используя Imagemagick, и затем у меня есть несколько виджетов, которые выполняют различные действия с изображением (размытие, черно-белое изображение, уровни и т. Д.).Существует предварительный просмотр изображения, который я показываю конечному пользователю каждый раз, когда им манипулируют.

Проблема, с которой я столкнулся, заключается в том, что если, например, я применю некоторые эффекты размытия (используя горизонтальный слайдер), я не смогу удалитьэто как объект, которым уже манипулируют.

Вот мое подключение к функции

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 Ответ

2 голосов
/ 21 ноября 2010

Я думаю, что вы должны сохранить линию состояний вашего изображения (после применения нового эффекта вы должны создать новое состояние - копию изображения). Так что вы можете просто откатиться, если вам нужно. Структура списка будет хороша для этой цели. Используя такой подход, вы можете не только откатиться, но и полностью внедрить систему отмены-повтора.

Если вы хотите применить новый эффект к вашему изображению - сделайте новую копию и работайте с ней. Если эффект создан, поместите его в список состояний, если отмените - удалите. Для копирования QImage используйте его метод копирования.

Для предварительного просмотра просто измените размер изображения и отобразите его.

PS: не рекомендуется применять эффект непосредственно к предварительному просмотру, поскольку результат может отличаться от конечного результата (когда эффект применяется к немасштабированному изображению).

EDIT: Также я думаю, что можно оптимизировать сохранение состояний для небольших эффектов, применяемых к части вашего изображения (например, мазок кисти). В такой ситуации действительно нужно сохранить только ту часть изображения, где был нанесен штрих. Например, вы можете создать что-то в виде StateManager, который будет знать, как выполнять отмену / повтор, класс State (базовый класс для состояний) и некоторые подклассы состояний для реализации ваших потребностей: CompleteState : State для сохранения эффекта, примененного ко всем изображение и PartState : State для эффекта, примененного к детали.

...