AlbumShaper
1.0a3
|
Interface for adjusting image grain by bluring and sharpening. More...
#include <grainEditor.h>
Public Member Functions | |
GrainEditor (QString filename, QWidget *parent=0, const char *name=0) | |
Constructs layout. | |
~GrainEditor () | |
QImage * | getModifiedImage () |
get modified image that resulted from adjustments | |
Protected Member Functions | |
void | keyPressEvent (QKeyEvent *e) |
void | keyReleaseEvent (QKeyEvent *e) |
Private Slots | |
void | selectPreviewImageType (int selection) |
updates preview image | |
void | resetBoundaries () |
reset blur/sharpen of object boundaries | |
void | resetRegions () |
reset blur/sharpen of regions | |
void | applyAction () |
check for changes to settings, if so | |
void | resetAction () |
resets image grain to original state | |
void | previewResized () |
handle resize preview signals | |
void | generateAdjustedPreviewImage () |
generate and set adjusted image | |
Private Member Functions | |
void | adjustImage (QImage &image, QPoint offset) |
Private Attributes | |
QString | fileName |
QSize | origImageSize |
QImage | edgesImage |
int * | clusterMap |
int | numRegions |
PanningPreviewInterface * | previewInterface |
Preview image. | |
SelectionPlacementInterface * | selectionPlacementInterface |
Interface for placing selection. | |
QComboBox * | previewSelection |
QFrame * | buttonsFrame |
BlurSharpenSlider * | boundariesSlider |
Grain slider. | |
ClickableLabel * | boundariesIcon |
BlurSharpenSlider * | regionsSlider |
ClickableLabel * | regionsIcon |
Interface for adjusting image grain by bluring and sharpening.
Definition at line 31 of file grainEditor.h.
GrainEditor::GrainEditor | ( | QString | filename, |
QWidget * | parent = 0 , |
||
const char * | name = 0 |
||
) |
Constructs layout.
Definition at line 36 of file grainEditor.cpp.
References applyAction(), boundariesIcon, boundariesSlider, buttonsFrame, clusterMap, edgesImage, fileName, generateAdjustedPreviewImage(), EdgeDetect::getClusterMap(), getImageSize(), EdgeDetect::getNumClusters(), IMAGE_PATH, numRegions, origImageSize, previewInterface, previewResized(), previewSelection, resetAction(), resetBoundaries(), scaleImage(), selectionPlacementInterface, selectPreviewImageType(), ClickableLabel::setPixmap(), SLIDER_RADIUS, and WIDGET_SPACING.
: QDialog(parent,name,true) { //record filename this->fileName = fileName; //record original image size getImageSize( fileName, origImageSize ); //construct edges image //speed up edge finding by scaling image down to < 800x600 scaleImage( fileName, edgesImage, 512, 384 ); EdgeDetect detector( &edgesImage ); clusterMap = detector.getClusterMap(); numRegions = detector.getNumClusters(); QFrame* visibleFrame = new QFrame( this, "visible widgets" ); //-------------- //Preview frame previewInterface = new PanningPreviewInterface( fileName, visibleFrame, "previewInterface" ); previewSelection = new QComboBox( visibleFrame, "previewSelction" ); previewSelection->insertItem( tr("Split View") ); previewSelection->insertItem( tr("Original Image") ); previewSelection->insertItem( tr("Adjusted Image") ); connect( previewSelection, SIGNAL(activated(int)), this, SLOT(selectPreviewImageType(int)) ); //-------------- //Controls frame QFrame* controlsFrame = new QFrame( visibleFrame, "controlsFrame" ); QLabel* selectionLabel = new QLabel( tr("Region Shown in Detail:"), controlsFrame, "selectionLabel" ); selectionPlacementInterface = new SelectionPlacementInterface( fileName, controlsFrame, "selectionPlacementInterface" ); //-- connect( previewInterface, SIGNAL( selectionChanged() ), this, SLOT( previewResized() ) ); connect( selectionPlacementInterface, SIGNAL(placementChanged(QRect)), previewInterface, SLOT(setSelection(QRect)) ); //-- boundariesSlider = new BlurSharpenSlider( Qt::Vertical, controlsFrame ); boundariesSlider->setMinValue( -SLIDER_RADIUS ); boundariesSlider->setMaxValue( SLIDER_RADIUS ); connect( boundariesSlider, SIGNAL(valueChanged(int)), this, SLOT(generateAdjustedPreviewImage()) ); boundariesIcon = new ClickableLabel( controlsFrame, "boundariesIcon" ); connect( boundariesIcon, SIGNAL(clicked()), SLOT(resetBoundaries()) ); // boundariesIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/boundaries.png") ); // QToolTip::add( boundariesSlider, tr("Blur/sharpen boundaries") ); // QToolTip::add( boundariesIcon, tr("Reset boundaries") ); boundariesIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/blurSharpen.png") ); QToolTip::add( boundariesSlider, tr("Blur/Sharpen Image") ); QToolTip::add( boundariesIcon, tr("Reset") ); //-- /* regionsSlider = new QSlider(Qt::Vertical, controlsFrame ); regionsSlider->setMinValue( -SLIDER_RADIUS ); regionsSlider->setMaxValue( SLIDER_RADIUS ); connect( regionsSlider, SIGNAL(valueChanged(int)), this, SLOT(generateAdjustedPreviewImage()) ); QToolTip::add( regionsSlider, tr("Blur/sharpen regions") ); regionsIcon = new ClickableLabel( controlsFrame, "regionsIcon" ); regionsIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/regions.png") ); connect( regionsIcon, SIGNAL(clicked()), SLOT(resetRegions()) ); QToolTip::add( regionsIcon, tr("Reset regions") ); */ //-- QGridLayout* controlsGrid = new QGridLayout( controlsFrame, 6, 4, 0 ); controlsGrid->setRowStretch( 0, 1 ); controlsGrid->addMultiCellWidget( selectionLabel, 1,1, 0,3 ); controlsGrid->addMultiCellWidget( selectionPlacementInterface, 2,2, 0,3 ); controlsGrid->addWidget( boundariesSlider, 3, 1 ); controlsGrid->addWidget( boundariesIcon, 4, 1 ); // controlsGrid->addWidget( regionsSlider, 3, 2 ); // controlsGrid->addWidget( regionsIcon, 4, 2 ); //make sure sliders have enough space so all slider units are settable controlsGrid->setRowSpacing( 3, 2*SLIDER_RADIUS + 5) ; controlsGrid->setRowStretch( 5, 1 ); controlsGrid->setSpacing( WIDGET_SPACING ); controlsGrid->setColStretch( 0, 1 ); controlsGrid->setColStretch( 3, 1 ); //-------------- //Dialog buttons: buttonsFrame = new QFrame( visibleFrame, "dialogButtons" ); QPushButton* applyButton = new QPushButton( tr("Apply"), buttonsFrame ); applyButton->setDefault(true); applyButton->setFocus(); connect( applyButton, SIGNAL(clicked()), SLOT(applyAction()) ); QPushButton* cancelButton = new QPushButton( tr("Cancel"), buttonsFrame ); connect( cancelButton, SIGNAL(clicked()), SLOT(reject()) ); QPushButton* resetButton = new QPushButton( tr("Reset"), buttonsFrame ); connect( resetButton, SIGNAL(clicked()), SLOT(resetAction()) ); QGridLayout* buttonsGrid = new QGridLayout( buttonsFrame, 1, 5, 0 ); buttonsGrid->setColStretch( 0, 1 ); buttonsGrid->addWidget( applyButton, 0, 1 ); buttonsGrid->addWidget( cancelButton, 0, 2 ); buttonsGrid->addWidget( resetButton, 0, 3 ); buttonsGrid->setColStretch( 4, 1 ); buttonsGrid->setSpacing( WIDGET_SPACING ); //-------------- //Top level grid QGridLayout* mainGrid = new QGridLayout( visibleFrame, 3, 2, 0 ); mainGrid->addWidget( previewInterface, 0,0 ); mainGrid->addWidget( previewSelection, 1,0, Qt::AlignHCenter ); mainGrid->addMultiCellWidget( controlsFrame, 0,1, 1,1 ); mainGrid->addMultiCellWidget( buttonsFrame, 2,2, 0,1 ); mainGrid->setRowStretch( 0, 1 ); mainGrid->setColStretch( 0, 1 ); mainGrid->setSpacing( WIDGET_SPACING ); mainGrid->setMargin( WIDGET_SPACING ); QGridLayout* invisibleGrid = new QGridLayout( this, 2, 1, 0 ); invisibleGrid->addWidget( visibleFrame, 0, 0 ); invisibleGrid->setRowStretch( 0, 1 ); //PLATFORM_SPECIFIC_CODE //windows users expect a grip, but qt doesn't put one in by default. we'll add //it for them too. :-) #if defined(Q_OS_WIN) QSizeGrip* sizeGrip = new QSizeGrip( this ); invisibleGrid->addWidget( sizeGrip, 1, 0, Qt::AlignRight | Qt::AlignBottom ); #endif //-------------- //Window caption setCaption( tr("Grain Editor") ); //------------------------------- }
GrainEditor::~GrainEditor | ( | ) |
Definition at line 188 of file grainEditor.cpp.
{ }
void GrainEditor::adjustImage | ( | QImage & | image, |
QPoint | offset | ||
) | [private] |
Definition at line 262 of file grainEditor.cpp.
References blurImage(), boundariesSlider, edgesImage, origImageSize, and sharpenImage().
Referenced by generateAdjustedPreviewImage(), and getModifiedImage().
{ //no adjustment - don't change the image at all if( boundariesSlider->value() == 0 )//&& //regionsSlider->value() == 0 ) { return; } //compute sigma float boundariesSigma; if( boundariesSlider->value() < 0 ) boundariesSigma = (80.0f * QABS(boundariesSlider->value()) ) / 255.0f; else boundariesSigma = (25.5f * QABS(boundariesSlider->value()) ) / 255.0f; // float regionsSigma = (20.0f * QABS(regionsSlider->value()) ) / 255.0f; //sharpen if ( boundariesSlider->value() < 0 ) { sharpenImage( image, boundariesSigma, offset, origImageSize, &edgesImage, true ); } //blur else if( boundariesSlider->value() > 0 ) { blurImage( image, boundariesSigma ); } /* //sharpen boundaries if ( boundariesSlider->value() < 0 ) { sharpenImage( image, boundariesSigma, offset, origImageSize, &edgesImage, true ); } //blur boundaries else if( boundariesSlider->value() > 0 ) { blurImage( image, boundariesSigma, offset, origImageSize, &edgesImage, NULL, numRegions, true ); } //sharpen regions if ( regionsSlider->value() < 0 ) { sharpenImage( image, regionsSigma, offset, origImageSize, &edgesImage, false ); } //blur regions else if( regionsSlider->value() > 0 ) { blurImage( image, regionsSigma, offset, origImageSize, &edgesImage, clusterMap, numRegions, false ); } */ }
void GrainEditor::applyAction | ( | ) | [private, slot] |
check for changes to settings, if so
Definition at line 190 of file grainEditor.cpp.
References boundariesSlider.
Referenced by GrainEditor().
{ //check if user has adjusted grain. //if any changes have taken place call "accept", else "reject" so image is not //updated and appear modified if( boundariesSlider->value() != 0 ) //|| // regionsSlider->value() != 0 ) { accept(); } else { reject(); } }
void GrainEditor::generateAdjustedPreviewImage | ( | ) | [private, slot] |
generate and set adjusted image
Definition at line 249 of file grainEditor.cpp.
References adjustImage(), SplitViewInterface::getOrigImage(), PanningPreviewInterface::getSelection(), previewInterface, and SplitViewInterface::setAdjustedImage().
Referenced by GrainEditor(), and previewResized().
{ //get original image QImage origImage = previewInterface->getOrigImage(); //construct adjusted image QImage adjustedImage = origImage.copy(); adjustImage( adjustedImage, previewInterface->getSelection().topLeft() ); //set adjusted image previewInterface->setAdjustedImage( adjustedImage ); }
QImage * GrainEditor::getModifiedImage | ( | ) |
get modified image that resulted from adjustments
Definition at line 219 of file grainEditor.cpp.
References adjustImage(), and fileName.
{ QImage* adjustedImage = new QImage(fileName); //convert to 32-bit depth if necessary if( adjustedImage->depth() < 32 ) { QImage* tmp = adjustedImage; adjustedImage = new QImage( tmp->convertDepth( 32, Qt::AutoColor ) ); delete tmp; tmp=NULL; } adjustImage( *adjustedImage, QPoint(0,0) ); return adjustedImage; }
void GrainEditor::keyPressEvent | ( | QKeyEvent * | e | ) | [protected] |
Definition at line 325 of file grainEditor.cpp.
References ADJUSTED_IMAGE, INV_SPLIT_VIEW, ORIGINAL_IMAGE, previewInterface, previewSelection, and SplitViewInterface::setPreviewMode().
{ if(e->key() == Qt::Key_Control ) { PREVIEW_MODE curMode = (PREVIEW_MODE) previewSelection->currentItem(); if(curMode == ORIGINAL_IMAGE) previewInterface->setPreviewMode( ADJUSTED_IMAGE, true ); else if(curMode == ADJUSTED_IMAGE) previewInterface->setPreviewMode( ORIGINAL_IMAGE, true ); else previewInterface->setPreviewMode( INV_SPLIT_VIEW ); } else { QDialog::keyPressEvent(e); } }
void GrainEditor::keyReleaseEvent | ( | QKeyEvent * | e | ) | [protected] |
Definition at line 340 of file grainEditor.cpp.
References previewInterface, previewSelection, and SplitViewInterface::setPreviewMode().
{ if(e->key() == Qt::Key_Control ) { previewInterface->setPreviewMode( (PREVIEW_MODE) previewSelection->currentItem(), false ); } else { QDialog::keyReleaseEvent(e); } }
void GrainEditor::previewResized | ( | ) | [private, slot] |
handle resize preview signals
Definition at line 240 of file grainEditor.cpp.
References generateAdjustedPreviewImage(), PanningPreviewInterface::getSelection(), previewInterface, selectionPlacementInterface, and SelectionPlacementInterface::setSelectedRegion().
Referenced by GrainEditor().
{ //reset selected region in selection placement interface selectionPlacementInterface->setSelectedRegion( previewInterface->getSelection() ); //regenerate adjusted image and repaint generateAdjustedPreviewImage(); }
void GrainEditor::resetAction | ( | ) | [private, slot] |
resets image grain to original state
Definition at line 213 of file grainEditor.cpp.
References boundariesSlider.
Referenced by GrainEditor().
{ boundariesSlider->setValue( 0 ); //regionsSlider->setValue( 0 ); }
void GrainEditor::resetBoundaries | ( | ) | [private, slot] |
reset blur/sharpen of object boundaries
Definition at line 203 of file grainEditor.cpp.
References boundariesSlider.
Referenced by GrainEditor().
{ boundariesSlider->setValue( 0 ); }
void GrainEditor::resetRegions | ( | ) | [private, slot] |
reset blur/sharpen of regions
Definition at line 208 of file grainEditor.cpp.
{
//regionsSlider->setValue( 0 );
}
void GrainEditor::selectPreviewImageType | ( | int | selection | ) | [private, slot] |
updates preview image
Definition at line 235 of file grainEditor.cpp.
References previewInterface, and SplitViewInterface::setPreviewMode().
Referenced by GrainEditor().
{ previewInterface->setPreviewMode( (PREVIEW_MODE)selection ); }
ClickableLabel* GrainEditor::boundariesIcon [private] |
Definition at line 101 of file grainEditor.h.
Referenced by GrainEditor().
BlurSharpenSlider* GrainEditor::boundariesSlider [private] |
Grain slider.
Definition at line 100 of file grainEditor.h.
Referenced by adjustImage(), applyAction(), GrainEditor(), resetAction(), and resetBoundaries().
QFrame* GrainEditor::buttonsFrame [private] |
Definition at line 97 of file grainEditor.h.
Referenced by GrainEditor().
int* GrainEditor::clusterMap [private] |
Definition at line 87 of file grainEditor.h.
Referenced by GrainEditor().
QImage GrainEditor::edgesImage [private] |
Definition at line 84 of file grainEditor.h.
Referenced by adjustImage(), and GrainEditor().
QString GrainEditor::fileName [private] |
Definition at line 78 of file grainEditor.h.
Referenced by getModifiedImage(), and GrainEditor().
int GrainEditor::numRegions [private] |
Definition at line 88 of file grainEditor.h.
Referenced by GrainEditor().
QSize GrainEditor::origImageSize [private] |
Definition at line 81 of file grainEditor.h.
Referenced by adjustImage(), and GrainEditor().
Preview image.
Definition at line 91 of file grainEditor.h.
Referenced by generateAdjustedPreviewImage(), GrainEditor(), keyPressEvent(), keyReleaseEvent(), previewResized(), and selectPreviewImageType().
QComboBox* GrainEditor::previewSelection [private] |
Definition at line 96 of file grainEditor.h.
Referenced by GrainEditor(), keyPressEvent(), and keyReleaseEvent().
ClickableLabel* GrainEditor::regionsIcon [private] |
Definition at line 104 of file grainEditor.h.
BlurSharpenSlider* GrainEditor::regionsSlider [private] |
Definition at line 103 of file grainEditor.h.
Interface for placing selection.
Definition at line 94 of file grainEditor.h.
Referenced by GrainEditor(), and previewResized().