/* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2005-03-26 * Description : a digiKam image editor plugin to restore * a photograph * * Copyright (C) 2005-2008 by Gilles Caulier * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ // TQt includes. #include #include #include #include #include #include #include #include // KDE includes. #include #include #include #include #include #include #include #include #include // Local includes. #include "version.h" #include "ddebug.h" #include "imageiface.h" #include "greycstorationsettings.h" #include "greycstorationwidget.h" #include "greycstorationiface.h" #include "imageeffect_restoration.h" #include "imageeffect_restoration.moc" namespace DigikamRestorationImagesPlugin { ImageEffect_Restoration::ImageEffect_Restoration(TQWidget* parent) : Digikam::CtrlPanelDlg(parent, i18n("Photograph Restoration"), "restoration", true, true, true, Digikam::ImagePannelWidget::SeparateViewAll) { TQString whatsThis; // About data and help button. TDEAboutData* about = new TDEAboutData("digikam", I18N_NOOP("Photograph Restoration"), digikam_version, I18N_NOOP("A digiKam image plugin to restore a photograph."), TDEAboutData::License_GPL, "(c) 2005-2008, Gilles Caulier", 0, "http://www.digikam.org"); about->addAuthor("Gilles Caulier", I18N_NOOP("Author and maintainer"), "caulier dot gilles at gmail dot com"); about->addAuthor("David Tschumperle", I18N_NOOP("CImg library"), 0, "http://cimg.sourceforge.net"); about->addAuthor("Gerhard Kulzer", I18N_NOOP("Feedback and plugin polishing"), "gerhard at kulzer.net"); setAboutData(about); // ------------------------------------------------------------- m_mainTab = new TQTabWidget( m_imagePreviewWidget ); TQWidget* firstPage = new TQWidget( m_mainTab ); TQGridLayout* grid = new TQGridLayout( firstPage, 2, 2, spacingHint()); m_mainTab->addTab( firstPage, i18n("Preset") ); KURLLabel *cimgLogoLabel = new KURLLabel(firstPage); cimgLogoLabel->setText(TQString()); cimgLogoLabel->setURL("http://cimg.sourceforge.net"); TDEGlobal::dirs()->addResourceType("logo-cimg", TDEGlobal::dirs()->kde_default("data") + "digikam/data"); TQString directory = TDEGlobal::dirs()->findResourceDir("logo-cimg", "logo-cimg.png"); cimgLogoLabel->setPixmap( TQPixmap( directory + "logo-cimg.png" ) ); TQToolTip::add(cimgLogoLabel, i18n("Visit CImg library website")); TQLabel *typeLabel = new TQLabel(i18n("Filtering type:"), firstPage); typeLabel->setAlignment ( TQt::AlignRight | TQt::AlignVCenter); m_restorationTypeCB = new TQComboBox( false, firstPage ); m_restorationTypeCB->insertItem( i18n("None") ); m_restorationTypeCB->insertItem( i18n("Reduce Uniform Noise") ); m_restorationTypeCB->insertItem( i18n("Reduce JPEG Artefacts") ); m_restorationTypeCB->insertItem( i18n("Reduce Texturing") ); TQWhatsThis::add( m_restorationTypeCB, i18n("

Select the filter preset to use for photograph restoration:

" "None: Most common values. Puts settings to default.

" "Reduce Uniform Noise: reduce small image artifacts like sensor noise.

" "Reduce JPEG Artefacts: reduce large image artifacts like JPEG compression mosaic.

" "Reduce Texturing: reduce image artifacts like paper texture or Moire patterns " "of a scanned image.

")); grid->addMultiCellWidget(cimgLogoLabel, 0, 0, 1, 1); grid->addMultiCellWidget(typeLabel, 1, 1, 0, 0); grid->addMultiCellWidget(m_restorationTypeCB, 1, 1, 1, 1); grid->setRowStretch(1, 10); // ------------------------------------------------------------- m_settingsWidget = new Digikam::GreycstorationWidget( m_mainTab ); m_imagePreviewWidget->setUserAreaWidget(m_mainTab); // ------------------------------------------------------------- connect(cimgLogoLabel, TQT_SIGNAL(leftClickedURL(const TQString&)), this, TQT_SLOT(processCImgURL(const TQString&))); connect(m_restorationTypeCB, TQT_SIGNAL(activated(int)), this, TQT_SLOT(slotResetValues(int))); } ImageEffect_Restoration::~ImageEffect_Restoration() { } void ImageEffect_Restoration::renderingFinished() { m_imagePreviewWidget->setEnable(true); m_mainTab->setEnabled(true); } void ImageEffect_Restoration::readUserSettings() { TDEConfig* config = kapp->config(); config->setGroup("restoration Tool Dialog"); Digikam::GreycstorationSettings settings; settings.fastApprox = config->readBoolEntry("FastApprox", true); settings.interp = config->readNumEntry("Interpolation", Digikam::GreycstorationSettings::NearestNeighbor); settings.amplitude = config->readDoubleNumEntry("Amplitude", 60.0); settings.sharpness = config->readDoubleNumEntry("Sharpness", 0.7); settings.anisotropy = config->readDoubleNumEntry("Anisotropy", 0.3); settings.alpha = config->readDoubleNumEntry("Alpha", 0.6); settings.sigma = config->readDoubleNumEntry("Sigma", 1.1); settings.gaussPrec = config->readDoubleNumEntry("GaussPrec", 2.0); settings.dl = config->readDoubleNumEntry("Dl", 0.8); settings.da = config->readDoubleNumEntry("Da", 30.0); settings.nbIter = config->readNumEntry("Iteration", 1); settings.tile = config->readNumEntry("Tile", 512); settings.btile = config->readNumEntry("BTile", 4); m_settingsWidget->setSettings(settings); int p = config->readNumEntry("Preset", NoPreset); m_restorationTypeCB->setCurrentItem(p); if (p == NoPreset) m_settingsWidget->setEnabled(true); else m_settingsWidget->setEnabled(false); } void ImageEffect_Restoration::writeUserSettings() { Digikam::GreycstorationSettings settings = m_settingsWidget->getSettings(); TDEConfig* config = kapp->config(); config->setGroup("restoration Tool Dialog"); config->writeEntry("Preset", m_restorationTypeCB->currentItem()); config->writeEntry("FastApprox", settings.fastApprox); config->writeEntry("Interpolation", settings.interp); config->writeEntry("Amplitude", settings.amplitude); config->writeEntry("Sharpness", settings.sharpness); config->writeEntry("Anisotropy", settings.anisotropy); config->writeEntry("Alpha", settings.alpha); config->writeEntry("Sigma", settings.sigma); config->writeEntry("GaussPrec", settings.gaussPrec); config->writeEntry("Dl", settings.dl); config->writeEntry("Da", settings.da); config->writeEntry("Iteration", settings.nbIter); config->writeEntry("Tile", settings.tile); config->writeEntry("BTile", settings.btile); config->sync(); } void ImageEffect_Restoration::slotResetValues(int i) { if (i == NoPreset) m_settingsWidget->setEnabled(true); else m_settingsWidget->setEnabled(false); resetValues(); } void ImageEffect_Restoration::resetValues() { Digikam::GreycstorationSettings settings; settings.setRestorationDefaultSettings(); switch(m_restorationTypeCB->currentItem()) { case ReduceUniformNoise: { settings.amplitude = 40.0; break; } case ReduceJPEGArtefacts: { settings.sharpness = 0.3; settings.sigma = 1.0; settings.amplitude = 100.0; settings.nbIter = 2; break; } case ReduceTexturing: { settings.sharpness = 0.5; settings.sigma = 1.5; settings.amplitude = 100.0; settings.nbIter = 2; break; } } m_settingsWidget->setSettings(settings); } void ImageEffect_Restoration::processCImgURL(const TQString& url) { TDEApplication::kApplication()->invokeBrowser(url); } void ImageEffect_Restoration::prepareEffect() { m_mainTab->setEnabled(false); Digikam::DImg previewImage = m_imagePreviewWidget->getOriginalRegionImage(); m_threadedFilter = dynamic_cast( new Digikam::GreycstorationIface( &previewImage, m_settingsWidget->getSettings(), Digikam::GreycstorationIface::Restore, 0, 0, 0, this)); } void ImageEffect_Restoration::prepareFinal() { m_mainTab->setEnabled(false); Digikam::ImageIface iface(0, 0); uchar *data = iface.getOriginalImage(); Digikam::DImg originalImage(iface.originalWidth(), iface.originalHeight(), iface.originalSixteenBit(), iface.originalHasAlpha(), data); m_threadedFilter = dynamic_cast( new Digikam::GreycstorationIface( &originalImage, m_settingsWidget->getSettings(), Digikam::GreycstorationIface::Restore, 0, 0, 0, this)); delete [] data; } void ImageEffect_Restoration::putPreviewData(void) { Digikam::DImg imDest = m_threadedFilter->getTargetImage(); m_imagePreviewWidget->setPreviewImage(imDest); } void ImageEffect_Restoration::putFinalData(void) { Digikam::ImageIface iface(0, 0); iface.putOriginalImage(i18n("Restoration"), m_threadedFilter->getTargetImage().bits()); } void ImageEffect_Restoration::slotUser3() { KURL loadRestorationFile = KFileDialog::getOpenURL(TDEGlobalSettings::documentPath(), TQString( "*" ), this, TQString( i18n("Photograph Restoration Settings File to Load")) ); if( loadRestorationFile.isEmpty() ) return; TQFile file(loadRestorationFile.path()); if ( file.open(IO_ReadOnly) ) { if (!m_settingsWidget->loadSettings(file, TQString("# Photograph Restoration Configuration File V2"))) { KMessageBox::error(this, i18n("\"%1\" is not a Photograph Restoration settings text file.") .arg(loadRestorationFile.fileName())); file.close(); return; } slotEffect(); } else KMessageBox::error(this, i18n("Cannot load settings from the Photograph Restoration text file.")); file.close(); m_restorationTypeCB->blockSignals(true); m_restorationTypeCB->setCurrentItem(NoPreset); m_restorationTypeCB->blockSignals(false); m_settingsWidget->setEnabled(true); } void ImageEffect_Restoration::slotUser2() { KURL saveRestorationFile = KFileDialog::getSaveURL(TDEGlobalSettings::documentPath(), TQString( "*" ), this, TQString( i18n("Photograph Restoration Settings File to Save")) ); if( saveRestorationFile.isEmpty() ) return; TQFile file(saveRestorationFile.path()); if ( file.open(IO_WriteOnly) ) m_settingsWidget->saveSettings(file, TQString("# Photograph Restoration Configuration File V2")); else KMessageBox::error(this, i18n("Cannot save settings to the Photograph Restoration text file.")); file.close(); } } // NameSpace DigikamRestorationImagesPlugin