1
/* ============================================================
3
* This file is a part of digiKam project
4
* http://www.digikam.org
7
* Description : a digiKam image editor plugin to restore
10
* Copyright (C) 2005-2010 by Gilles Caulier <caulier dot gilles at gmail dot com>
12
* This program is free software; you can redistribute it
13
* and/or modify it under the terms of the GNU General
14
* Public License as published by the Free Software Foundation;
15
* either version 2, or (at your option)
18
* This program is distributed in the hope that it will be useful,
19
* but WITHOUT ANY WARRANTY; without even the implied warranty of
20
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
* GNU General Public License for more details.
23
* ============================================================ */
25
#include "restorationtool.moc"
30
#include <QGridLayout>
37
#include <kapplication.h>
38
#include <kcombobox.h>
39
#include <kfiledialog.h>
41
#include <kglobalsettings.h>
42
#include <kiconloader.h>
44
#include <kmessagebox.h>
45
#include <kstandarddirs.h>
46
#include <ktabwidget.h>
47
#include <ktoolinvocation.h>
48
#include <kurllabel.h>
52
#include "editortoolsettings.h"
53
#include "greycstorationfilter.h"
54
#include "greycstorationsettings.h"
55
#include "imageiface.h"
56
#include "imageregionwidget.h"
58
namespace DigikamEnhanceImagePlugin
61
class RestorationTool::RestorationToolPriv
65
RestorationToolPriv() :
73
static const QString configGroupName;
74
static const QString configPresetEntry;
75
static const QString configFastApproxEntry;
76
static const QString configInterpolationEntry;
77
static const QString configAmplitudeEntry;
78
static const QString configSharpnessEntry;
79
static const QString configAnisotropyEntry;
80
static const QString configAlphaEntry;
81
static const QString configSigmaEntry;
82
static const QString configGaussPrecEntry;
83
static const QString configDlEntry;
84
static const QString configDaEntry;
85
static const QString configIterationEntry;
86
static const QString configTileEntry;
87
static const QString configBTileEntry;
91
KComboBox* restorationTypeCB;
93
GreycstorationSettings* settingsWidget;
94
ImageRegionWidget* previewWidget;
95
EditorToolSettings* gboxSettings;
97
const QString RestorationTool::RestorationToolPriv::configGroupName("restoration Tool");
98
const QString RestorationTool::RestorationToolPriv::configPresetEntry("Preset");
99
const QString RestorationTool::RestorationToolPriv::configFastApproxEntry("FastApprox");
100
const QString RestorationTool::RestorationToolPriv::configInterpolationEntry("Interpolation");
101
const QString RestorationTool::RestorationToolPriv::configAmplitudeEntry("Amplitude");
102
const QString RestorationTool::RestorationToolPriv::configSharpnessEntry("Sharpness");
103
const QString RestorationTool::RestorationToolPriv::configAnisotropyEntry("Anisotropy");
104
const QString RestorationTool::RestorationToolPriv::configAlphaEntry("Alpha");
105
const QString RestorationTool::RestorationToolPriv::configSigmaEntry("Sigma");
106
const QString RestorationTool::RestorationToolPriv::configGaussPrecEntry("GaussPrec");
107
const QString RestorationTool::RestorationToolPriv::configDlEntry("Dl");
108
const QString RestorationTool::RestorationToolPriv::configDaEntry("Da");
109
const QString RestorationTool::RestorationToolPriv::configIterationEntry("Iteration");
110
const QString RestorationTool::RestorationToolPriv::configTileEntry("Tile");
111
const QString RestorationTool::RestorationToolPriv::configBTileEntry("BTile");
113
// --------------------------------------------------------
115
RestorationTool::RestorationTool(QObject* parent)
116
: EditorToolThreaded(parent),
117
d(new RestorationToolPriv)
119
setObjectName("restoration");
120
setToolName(i18n("Restoration"));
121
setToolIcon(SmallIcon("restoration"));
123
// -------------------------------------------------------------
125
d->gboxSettings = new EditorToolSettings;
126
d->gboxSettings->setButtons(EditorToolSettings::Default|
127
EditorToolSettings::Ok|
128
EditorToolSettings::Cancel|
129
EditorToolSettings::Load|
130
EditorToolSettings::SaveAs|
131
EditorToolSettings::Try);
133
QGridLayout* gridSettings = new QGridLayout(d->gboxSettings->plainPage());
134
d->mainTab = new KTabWidget( d->gboxSettings->plainPage() );
136
QWidget* firstPage = new QWidget( d->mainTab );
137
QGridLayout* grid = new QGridLayout(firstPage);
138
d->mainTab->addTab( firstPage, i18n("Preset") );
140
KUrlLabel* cimgLogoLabel = new KUrlLabel(firstPage);
141
cimgLogoLabel->setText(QString());
142
cimgLogoLabel->setUrl("http://cimg.sourceforge.net");
143
cimgLogoLabel->setPixmap(QPixmap(KStandardDirs::locate("data", "digikam/data/logo-cimg.png")));
144
cimgLogoLabel->setToolTip( i18n("Visit CImg library website"));
146
QLabel* typeLabel = new QLabel(i18n("Filtering type:"), firstPage);
147
typeLabel->setAlignment ( Qt::AlignRight | Qt::AlignVCenter);
148
d->restorationTypeCB = new KComboBox(firstPage);
149
d->restorationTypeCB->addItem( i18nc("no restoration preset", "None") );
150
d->restorationTypeCB->addItem( i18n("Reduce Uniform Noise") );
151
d->restorationTypeCB->addItem( i18n("Reduce JPEG Artifacts") );
152
d->restorationTypeCB->addItem( i18n("Reduce Texturing") );
153
d->restorationTypeCB->setWhatsThis(i18n("<p>Select the filter preset to use for photograph restoration here:</p>"
154
"<p><b>None</b>: Most common values. Puts settings to default.<br/>"
155
"<b>Reduce Uniform Noise</b>: reduce small image artifacts such as sensor noise.<br/>"
156
"<b>Reduce JPEG Artifacts</b>: reduce large image artifacts, such as a JPEG compression mosaic.<br/>"
157
"<b>Reduce Texturing</b>: reduce image artifacts, such as paper texture, or Moire patterns "
158
"on scanned images.</p>"));
160
grid->addWidget(cimgLogoLabel, 0, 1, 1, 1);
161
grid->addWidget(typeLabel, 1, 0, 1, 1);
162
grid->addWidget(d->restorationTypeCB, 1, 1, 1, 1);
163
grid->setRowStretch(1, 10);
164
grid->setMargin(d->gboxSettings->spacingHint());
167
// -------------------------------------------------------------
169
d->settingsWidget = new GreycstorationSettings( d->mainTab );
170
gridSettings->addWidget(d->mainTab, 0, 1, 1, 1);
171
gridSettings->addWidget(new QLabel(d->gboxSettings->plainPage()), 1, 1, 1, 1);
172
gridSettings->setMargin(d->gboxSettings->spacingHint());
173
gridSettings->setSpacing(d->gboxSettings->spacingHint());
174
gridSettings->setRowStretch(2, 10);
176
// -------------------------------------------------------------
178
d->previewWidget = new ImageRegionWidget;
180
setToolSettings(d->gboxSettings);
181
setToolView(d->previewWidget);
182
setPreviewModeMask(PreviewToolBar::AllPreviewModes);
185
// -------------------------------------------------------------
187
connect(cimgLogoLabel, SIGNAL(leftClickedUrl(QString)),
188
this, SLOT(processCImgUrl(QString)));
190
connect(d->restorationTypeCB, SIGNAL(activated(int)),
191
this, SLOT(slotResetValues(int)));
193
// -------------------------------------------------------------
195
GreycstorationContainer defaults;
196
defaults.setRestorationDefaultSettings();
197
d->settingsWidget->setDefaultSettings(defaults);
200
RestorationTool::~RestorationTool()
205
void RestorationTool::readSettings()
207
KSharedConfig::Ptr config = KGlobal::config();
208
KConfigGroup group = config->group(d->configGroupName);
210
GreycstorationContainer prm;
211
GreycstorationContainer defaults;
212
defaults.setRestorationDefaultSettings();
214
prm.fastApprox = group.readEntry(d->configFastApproxEntry, defaults.fastApprox);
215
prm.interp = group.readEntry(d->configInterpolationEntry, defaults.interp);
216
prm.amplitude = group.readEntry(d->configAmplitudeEntry, (double)defaults.amplitude);
217
prm.sharpness = group.readEntry(d->configSharpnessEntry, (double)defaults.sharpness);
218
prm.anisotropy = group.readEntry(d->configAnisotropyEntry, (double)defaults.anisotropy);
219
prm.alpha = group.readEntry(d->configAlphaEntry, (double)defaults.alpha);
220
prm.sigma = group.readEntry(d->configSigmaEntry, (double)defaults.sigma);
221
prm.gaussPrec = group.readEntry(d->configGaussPrecEntry, (double)defaults.gaussPrec);
222
prm.dl = group.readEntry(d->configDlEntry, (double)defaults.dl);
223
prm.da = group.readEntry(d->configDaEntry, (double)defaults.da);
224
prm.nbIter = group.readEntry(d->configIterationEntry, defaults.nbIter);
225
prm.tile = group.readEntry(d->configTileEntry, defaults.tile);
226
prm.btile = group.readEntry(d->configBTileEntry, defaults.btile);
227
d->settingsWidget->setSettings(prm);
229
int p = group.readEntry(d->configPresetEntry, (int)NoPreset);
230
d->restorationTypeCB->setCurrentIndex(p);
234
d->settingsWidget->setEnabled(true);
238
d->settingsWidget->setEnabled(false);
242
void RestorationTool::writeSettings()
244
GreycstorationContainer prm = d->settingsWidget->settings();
245
KSharedConfig::Ptr config = KGlobal::config();
246
KConfigGroup group = config->group(d->configGroupName);
248
group.writeEntry(d->configPresetEntry, d->restorationTypeCB->currentIndex());
249
group.writeEntry(d->configFastApproxEntry, prm.fastApprox);
250
group.writeEntry(d->configInterpolationEntry, prm.interp);
251
group.writeEntry(d->configAmplitudeEntry, (double)prm.amplitude);
252
group.writeEntry(d->configSharpnessEntry, (double)prm.sharpness);
253
group.writeEntry(d->configAnisotropyEntry, (double)prm.anisotropy);
254
group.writeEntry(d->configAlphaEntry, (double)prm.alpha);
255
group.writeEntry(d->configSigmaEntry, (double)prm.sigma);
256
group.writeEntry(d->configGaussPrecEntry, (double)prm.gaussPrec);
257
group.writeEntry(d->configDlEntry, (double)prm.dl);
258
group.writeEntry(d->configDaEntry, (double)prm.da);
259
group.writeEntry(d->configIterationEntry, prm.nbIter);
260
group.writeEntry(d->configTileEntry, prm.tile);
261
group.writeEntry(d->configBTileEntry, prm.btile);
265
void RestorationTool::slotResetValues(int i)
269
d->settingsWidget->setEnabled(true);
273
d->settingsWidget->setEnabled(false);
279
void RestorationTool::slotResetSettings()
281
GreycstorationContainer settings;
282
settings.setRestorationDefaultSettings();
284
switch (d->restorationTypeCB->currentIndex())
286
case ReduceUniformNoise:
288
settings.amplitude = 40.0;
292
case ReduceJPEGArtefacts:
294
settings.sharpness = 0.3F;
295
settings.sigma = 1.0;
296
settings.amplitude = 100.0;
301
case ReduceTexturing:
303
settings.sharpness = 0.5F;
304
settings.sigma = 1.5;
305
settings.amplitude = 100.0;
311
d->settingsWidget->setSettings(settings);
314
void RestorationTool::processCImgUrl(const QString& url)
316
KToolInvocation::invokeBrowser(url);
319
void RestorationTool::prepareEffect()
321
DImg previewImage = d->previewWidget->getOriginalRegionImage();
323
setFilter(new GreycstorationFilter(&previewImage,
324
d->settingsWidget->settings(), GreycstorationFilter::Restore,
325
0, 0, QImage(), this));
328
void RestorationTool::prepareFinal()
330
ImageIface iface(0, 0);
331
uchar* data = iface.getOriginalImage();
332
DImg originalImage(iface.originalWidth(), iface.originalHeight(),
333
iface.originalSixteenBit(), iface.originalHasAlpha(), data);
335
setFilter(new GreycstorationFilter(&originalImage,
336
d->settingsWidget->settings(), GreycstorationFilter::Restore,
337
0, 0, QImage(), this));
342
void RestorationTool::putPreviewData()
344
DImg imDest = filter()->getTargetImage();
345
d->previewWidget->setPreviewImage(imDest);
348
void RestorationTool::putFinalData()
350
ImageIface iface(0, 0);
351
iface.putOriginalImage(i18n("Restoration"), filter()->filterAction(), filter()->getTargetImage().bits());
354
void RestorationTool::slotLoadSettings()
356
KUrl loadRestorationFile = KFileDialog::getOpenUrl(KGlobalSettings::documentPath(),
357
QString( "*" ), kapp->activeWindow(),
358
QString( i18n("Photograph Restoration Settings File to Load")) );
360
if ( loadRestorationFile.isEmpty() )
365
QFile file(loadRestorationFile.toLocalFile());
367
if ( file.open(QIODevice::ReadOnly) )
369
if (!d->settingsWidget->loadSettings(file, QString("# Photograph Restoration Configuration File V2")))
371
KMessageBox::error(kapp->activeWindow(),
372
i18n("\"%1\" is not a Photograph Restoration settings text file.",
373
loadRestorationFile.fileName()));
382
KMessageBox::error(kapp->activeWindow(), i18n("Cannot load settings from the Photograph Restoration text file."));
386
d->restorationTypeCB->blockSignals(true);
387
d->restorationTypeCB->setCurrentIndex((int)NoPreset);
388
d->restorationTypeCB->blockSignals(false);
389
d->settingsWidget->setEnabled(true);
392
void RestorationTool::slotSaveAsSettings()
394
KUrl saveRestorationFile = KFileDialog::getSaveUrl(KGlobalSettings::documentPath(),
395
QString( "*" ), kapp->activeWindow(),
396
QString( i18n("Photograph Restoration Settings File to Save")) );
398
if ( saveRestorationFile.isEmpty() )
403
QFile file(saveRestorationFile.toLocalFile());
405
if ( file.open(QIODevice::WriteOnly) )
407
d->settingsWidget->saveSettings(file, QString("# Photograph Restoration Configuration File V2"));
411
KMessageBox::error(kapp->activeWindow(), i18n("Cannot save settings to the Photograph Restoration text file."));
417
} // namespace DigikamEnhanceImagePlugin