[Digikam-devel] [Bug 177827] Add vignetting effect to Digikam
Gilles Caulier
caulier.gilles at gmail.com
Fri Jan 15 18:38:51 GMT 2010
https://bugs.kde.org/show_bug.cgi?id=177827
Gilles Caulier <caulier.gilles at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |caulier.gilles at gmail.com
--- Comment #2 from Gilles Caulier <caulier gilles gmail com> 2010-01-15 19:38:45 ---
SVN commit 1075137 by jnarboux:
Add option to add vignetting.
Fix radius slider whose range was too large.
CCBUGS: 218906 177827
M +23 -11 antivignetting.cpp
M +4 -1 antivignetting.h
M +54 -32 antivignettingtool.cpp
---
trunk/extragear/graphics/digikam/imageplugins/lenscorrection/vignetting/antivignetting.cpp
#1075136:1075137
@@ -43,15 +43,17 @@
{
AntiVignetting::AntiVignetting(Digikam::DImg *orgImage, QObject *parent,
double density,
- double power, double radius, int xshift, int
yshift, bool normalize)
+ double power, double radius, int xshift, int
yshift,
+ bool normalize, bool anti)
: Digikam::DImgThreadedFilter(orgImage, parent, "AntiVignetting")
{
- m_density = density;
- m_power = power;
- m_radius = radius;
- m_xshift = xshift;
- m_yshift = yshift;
- m_normalize = normalize;
+ m_density = density;
+ m_power = power;
+ m_radius = radius;
+ m_xshift = xshift;
+ m_yshift = yshift;
+ m_normalize = normalize;
+ m_add_vignetting = anti;
initFilter();
}
@@ -89,7 +91,7 @@
// of the image.
xsize = ((Height + 1) / 2) + abs(m_xshift);
- ysize = ((Width + 1) / 2) + abs(m_yshift);
+ ysize = ((Width + 1) / 2) + abs(m_yshift);
diagonal = ((int) (sqrt((xsize * xsize) + (ysize * ysize)) + 0.5)) + 1;
ldens = new double[diagonal];
@@ -97,13 +99,23 @@
for (i = 0 ; !m_cancel && (i < diagonal) ; ++i)
{
if ( i >= erad )
- ldens[i] = 1;
+ {
+ if (!m_add_vignetting)
+ ldens[i] = 1.0;
+ else
+ ldens[i] = 0.0;
+ }
else
- ldens[i] = (1.0 + (m_density - 1) * pow(1.0 - (((double) i) /
(erad - 1)), m_power));
+ {
+ if (!m_add_vignetting)
+ ldens[i] = (1.0 + (m_density - 1) * pow(1.0 - (((double) i) /
(erad - 1)), m_power));
+ else
+ ldens[i] = 20.0 / (1.0 + (24 - (m_density - 1)) * pow(1.0 -
(((double) i) / (erad - 1)), m_power));
+ }
}
xctr = ((Height + 1) / 2) + m_xshift;
- yctr = ((Width + 1) / 2) + m_yshift;
+ yctr = ((Width + 1) / 2) + m_yshift;
for (row = 0 ; !m_cancel && (row < Width) ; ++row)
{
---
trunk/extragear/graphics/digikam/imageplugins/lenscorrection/vignetting/antivignetting.h
#1075136:1075137
@@ -37,7 +37,8 @@
public:
explicit AntiVignetting(Digikam::DImg *orgImage, QObject *parent=0, double
density=2.0,
- double power=1.0, double radius=1.0, int xshift=0,
int yshift=0, bool normalize=true);
+ double power=1.0, double radius=1.0, int xshift=0,
int yshift=0,
+ bool normalize=true, bool anti=true);
~AntiVignetting(){};
@@ -55,6 +56,8 @@
double m_density;
double m_power;
double m_radius;
+
+ bool m_add_vignetting;
};
} // namespace DigikamAntiVignettingImagesPlugin
---
trunk/extragear/graphics/digikam/imageplugins/lenscorrection/vignetting/antivignettingtool.cpp
#1075136:1075137
@@ -27,6 +27,7 @@
// Qt includes
+#include <QCheckBox>
#include <QGridLayout>
#include <QImage>
#include <QLabel>
@@ -80,6 +81,7 @@
configBrightnessAdjustmentEntry("BrightnessAdjustment"),
configContrastAdjustmentEntry("ContrastAdjustment"),
configGammaAdjustmentEntry("GammaAdjustment"),
+ configAddVignettingEntry("AddVignetting"),
maskPreviewLabel(0),
brightnessInput(0),
@@ -99,7 +101,8 @@
const QString configBrightnessAdjustmentEntry;
const QString configContrastAdjustmentEntry;
const QString configGammaAdjustmentEntry;
-
+ const QString configAddVignettingEntry;
+
QLabel* maskPreviewLabel;
RIntNumInput* brightnessInput;
@@ -109,6 +112,8 @@
RDoubleNumInput* densityInput;
RDoubleNumInput* powerInput;
RDoubleNumInput* radiusInput;
+
+ QCheckBox* addVignettingCheck;
ImageGuideWidget* previewWidget;
EditorToolSettings* gboxSettings;
@@ -130,6 +135,13 @@
d->gboxSettings = new EditorToolSettings;
// -------------------------------------------------------------
+
+ d->addVignettingCheck = new QCheckBox(i18n("Add vignetting"));
+ d->addVignettingCheck->setWhatsThis(i18n("This option add vignetting to
the image instead for removing it."
+ "Use it for creative
effects."));
+ d->addVignettingCheck->setChecked(false);
+
+ // -------------------------------------------------------------
d->maskPreviewLabel = new QLabel();
d->maskPreviewLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
@@ -162,7 +174,7 @@
QLabel *label3 = new QLabel(i18n("Radius:"));
d->radiusInput = new RDoubleNumInput();
d->radiusInput->setDecimals(1);
- d->radiusInput->input()->setRange(-100.0, 100.0, 0.1, true);
+ d->radiusInput->input()->setRange(0.1, 1.5, 0.1, true);
d->radiusInput->setDefaultValue(1.0);
d->radiusInput->setWhatsThis(i18n("This value is the radius of the center
filter. It is a "
"multiple of the half-diagonal measure of
the image, at which "
@@ -200,21 +212,22 @@
// -------------------------------------------------------------
QGridLayout* mainLayout = new QGridLayout();
- mainLayout->addWidget(d->maskPreviewLabel, 0, 0, 1, 3);
- mainLayout->addWidget(label1, 1, 0, 1, 3);
- mainLayout->addWidget(d->densityInput, 2, 0, 1, 3);
- mainLayout->addWidget(label2, 3, 0, 1, 3);
- mainLayout->addWidget(d->powerInput, 4, 0, 1, 3);
- mainLayout->addWidget(label3, 5, 0, 1, 3);
- mainLayout->addWidget(d->radiusInput, 6, 0, 1, 3);
- mainLayout->addWidget(line, 7, 0, 1, 3);
- mainLayout->addWidget(label4, 8, 0, 1, 3);
- mainLayout->addWidget(d->brightnessInput, 9, 0, 1, 3);
- mainLayout->addWidget(label5, 10, 0, 1, 3);
- mainLayout->addWidget(d->contrastInput, 11, 0, 1, 3);
- mainLayout->addWidget(label6, 12, 0, 1, 3);
- mainLayout->addWidget(d->gammaInput, 13, 0, 1, 3);
- mainLayout->setRowStretch(14, 10);
+ mainLayout->addWidget(d->maskPreviewLabel, 0, 0, 1, 3);
+ mainLayout->addWidget(label1, 1, 0, 1, 3);
+ mainLayout->addWidget(d->densityInput, 2, 0, 1, 3);
+ mainLayout->addWidget(label2, 3, 0, 1, 3);
+ mainLayout->addWidget(d->powerInput, 4, 0, 1, 3);
+ mainLayout->addWidget(label3, 5, 0, 1, 3);
+ mainLayout->addWidget(d->radiusInput, 6, 0, 1, 3);
+ mainLayout->addWidget(line, 7, 0, 1, 3);
+ mainLayout->addWidget(label4, 8, 0, 1, 3);
+ mainLayout->addWidget(d->brightnessInput, 9, 0, 1, 3);
+ mainLayout->addWidget(label5, 10, 0, 1, 3);
+ mainLayout->addWidget(d->contrastInput, 11, 0, 1, 3);
+ mainLayout->addWidget(label6, 12, 0, 1, 3);
+ mainLayout->addWidget(d->gammaInput, 13, 0, 1, 3);
+ mainLayout->addWidget(d->addVignettingCheck, 14, 0, 1, 3);
+ mainLayout->setRowStretch(15, 10);
mainLayout->setMargin(d->gboxSettings->spacingHint());
mainLayout->setSpacing(d->gboxSettings->spacingHint());
d->gboxSettings->plainPage()->setLayout(mainLayout);
@@ -242,6 +255,9 @@
this, SLOT(slotTimer()));
connect(d->gammaInput, SIGNAL(valueChanged (double)),
+ this, SLOT(slotTimer()));
+
+ connect(d->addVignettingCheck, SIGNAL(toggled(bool)),
this, SLOT(slotTimer()));
}
@@ -258,6 +274,7 @@
d->brightnessInput->setEnabled(true);
d->contrastInput->setEnabled(true);
d->gammaInput->setEnabled(true);
+ d->addVignettingCheck->setEnabled(true);
}
void AntiVignettingTool::readSettings()
@@ -273,7 +290,7 @@
d->brightnessInput->setValue(group.readEntry(d->configBrightnessAdjustmentEntry,
d->brightnessInput->defaultValue()));
d->contrastInput->setValue(group.readEntry(d->configContrastAdjustmentEntry,
d->contrastInput->defaultValue()));
d->gammaInput->setValue(group.readEntry(d->configGammaAdjustmentEntry,
d->gammaInput->defaultValue()));
-
+
d->addVignettingCheck->setChecked(group.readEntry(d->configAddVignettingEntry,
false));
blockWidgetSignals(false);
slotEffect();
@@ -290,7 +307,8 @@
group.writeEntry(d->configBrightnessAdjustmentEntry,
d->brightnessInput->value());
group.writeEntry(d->configContrastAdjustmentEntry,
d->contrastInput->value());
group.writeEntry(d->configGammaAdjustmentEntry,
d->gammaInput->value());
-
+ group.writeEntry(d->configAddVignettingEntry,
d->addVignettingCheck->isChecked());
+
group.sync();
}
@@ -318,11 +336,13 @@
d->brightnessInput->setEnabled(false);
d->contrastInput->setEnabled(false);
d->gammaInput->setEnabled(false);
+ d->addVignettingCheck->setEnabled(false);
- double dens = d->densityInput->value();
- double power = d->powerInput->value();
- double rad = d->radiusInput->value();
-
+ double dens = d->densityInput->value();
+ double power = d->powerInput->value();
+ double rad = d->radiusInput->value();
+ bool addvignetting = d->addVignettingCheck->isChecked();
+
ImageIface* iface = d->previewWidget->imageIface();
int orgWidth = iface->originalWidth();
int orgHeight = iface->originalHeight();
@@ -332,7 +352,7 @@
// Calc mask preview.
DImg preview(ps.width(), ps.height(), false);
memset(preview.bits(), 255, preview.numBytes());
- AntiVignetting maskPreview(&preview, 0, dens, power, rad, 0, 0, false);
+ AntiVignetting maskPreview(&preview, 0, dens, power, rad, 0, 0, false,
addvignetting);
maskPreview.startFilterDirectly(); // Run filter without to use
multithreading.
QPixmap pix = maskPreview.getTargetImage().convertToPixmap();
QPainter pt(&pix);
@@ -342,7 +362,7 @@
d->maskPreviewLabel->setPixmap(pix);
setFilter(dynamic_cast<DImgThreadedFilter *>(
- new AntiVignetting(iface->getOriginalImg(), this, dens,
power, rad, 0, 0, true)));
+ new AntiVignetting(iface->getOriginalImg(), this, dens,
power, rad, 0, 0, true, addvignetting)));
}
void AntiVignettingTool::prepareFinal()
@@ -354,14 +374,15 @@
d->contrastInput->setEnabled(false);
d->gammaInput->setEnabled(false);
- double dens = d->densityInput->value();
- double power = d->powerInput->value();
- double rad = d->radiusInput->value();
-
+ double dens = d->densityInput->value();
+ double power = d->powerInput->value();
+ double rad = d->radiusInput->value();
+ bool addvignetting = d->addVignettingCheck->isChecked();
+
ImageIface iface(0, 0);
setFilter(dynamic_cast<DImgThreadedFilter *>(
- new AntiVignetting(iface.getOriginalImg(), this, dens,
power, rad, 0, 0, true)));
+ new AntiVignetting(iface.getOriginalImg(), this, dens,
power, rad, 0, 0, true, addvignetting)));
}
void AntiVignettingTool::putPreviewData()
@@ -391,7 +412,7 @@
ImageIface* iface = d->previewWidget->imageIface();
DImg finalImage = filter()->getTargetImage();
- double b = (double)(d->brightnessInput->value() / 250.0);
+ double b = (double)(d->brightnessInput->value() / 250.0);
double c = (double)(d->contrastInput->value() / 100.0) + (double)(1.00);
double g = d->gammaInput->value();
@@ -412,7 +433,8 @@
d->radiusInput->blockSignals(b);
d->brightnessInput->blockSignals(b);
d->contrastInput->blockSignals(b);
- d->gammaInput->blockSignals(b);
+ d->gammaInput->blockSignals(b);
+ d->addVignettingCheck->blockSignals(b);
}
} // namespace DigikamAntiVignettingImagesPlugin
--
Configure bugmail: https://bugs.kde.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
More information about the Digikam-devel
mailing list