#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 |
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, 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.
00036 : QDialog(parent,name,true) 00037 { 00038 //record filename 00039 this->fileName = fileName; 00040 00041 //record original image size 00042 getImageSize( fileName, origImageSize ); 00043 00044 //construct edges image 00045 //speed up edge finding by scaling image down to < 800x600 00046 scaleImage( fileName, edgesImage, 512, 384 ); 00047 EdgeDetect detector( &edgesImage ); 00048 clusterMap = detector.getClusterMap(); 00049 numRegions = detector.getNumClusters(); 00050 00051 QFrame* visibleFrame = new QFrame( this, "visible widgets" ); 00052 //-------------- 00053 //Preview frame 00054 previewInterface = new PanningPreviewInterface( fileName, 00055 visibleFrame, "previewInterface" ); 00056 previewSelection = new QComboBox( visibleFrame, "previewSelction" ); 00057 previewSelection->insertItem( tr("Split View") ); 00058 previewSelection->insertItem( tr("Original Image") ); 00059 previewSelection->insertItem( tr("Adjusted Image") ); 00060 connect( previewSelection, SIGNAL(activated(int)), this, SLOT(selectPreviewImageType(int)) ); 00061 //-------------- 00062 //Controls frame 00063 QFrame* controlsFrame = new QFrame( visibleFrame, "controlsFrame" ); 00064 00065 QLabel* selectionLabel = new QLabel( tr("Region Shown in Detail:"), 00066 controlsFrame, "selectionLabel" ); 00067 00068 selectionPlacementInterface = new SelectionPlacementInterface( fileName, 00069 controlsFrame, 00070 "selectionPlacementInterface" ); 00071 //-- 00072 connect( previewInterface, SIGNAL( selectionChanged() ), 00073 this, SLOT( previewResized() ) ); 00074 connect( selectionPlacementInterface, SIGNAL(placementChanged(QRect)), 00075 previewInterface, SLOT(setSelection(QRect)) ); 00076 //-- 00077 boundariesSlider = new BlurSharpenSlider( Qt::Vertical, controlsFrame ); 00078 boundariesSlider->setMinValue( -SLIDER_RADIUS ); 00079 boundariesSlider->setMaxValue( SLIDER_RADIUS ); 00080 connect( boundariesSlider, SIGNAL(valueChanged(int)), 00081 this, SLOT(generateAdjustedPreviewImage()) ); 00082 00083 boundariesIcon = new ClickableLabel( controlsFrame, "boundariesIcon" ); 00084 connect( boundariesIcon, SIGNAL(clicked()), SLOT(resetBoundaries()) ); 00085 00086 // boundariesIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/boundaries.png") ); 00087 // QToolTip::add( boundariesSlider, tr("Blur/sharpen boundaries") ); 00088 // QToolTip::add( boundariesIcon, tr("Reset boundaries") ); 00089 boundariesIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/blurSharpen.png") ); 00090 QToolTip::add( boundariesSlider, tr("Blur/Sharpen Image") ); 00091 QToolTip::add( boundariesIcon, tr("Reset") ); 00092 //-- 00093 /* 00094 regionsSlider = new QSlider(Qt::Vertical, controlsFrame ); 00095 regionsSlider->setMinValue( -SLIDER_RADIUS ); 00096 regionsSlider->setMaxValue( SLIDER_RADIUS ); 00097 connect( regionsSlider, SIGNAL(valueChanged(int)), 00098 this, SLOT(generateAdjustedPreviewImage()) ); 00099 QToolTip::add( regionsSlider, tr("Blur/sharpen regions") ); 00100 00101 regionsIcon = new ClickableLabel( controlsFrame, "regionsIcon" ); 00102 regionsIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/regions.png") ); 00103 connect( regionsIcon, SIGNAL(clicked()), SLOT(resetRegions()) ); 00104 QToolTip::add( regionsIcon, tr("Reset regions") ); 00105 */ 00106 //-- 00107 QGridLayout* controlsGrid = new QGridLayout( controlsFrame, 6, 4, 0 ); 00108 controlsGrid->setRowStretch( 0, 1 ); 00109 00110 controlsGrid->addMultiCellWidget( selectionLabel, 1,1, 0,3 ); 00111 controlsGrid->addMultiCellWidget( selectionPlacementInterface, 2,2, 0,3 ); 00112 00113 controlsGrid->addWidget( boundariesSlider, 3, 1 ); 00114 controlsGrid->addWidget( boundariesIcon, 4, 1 ); 00115 00116 // controlsGrid->addWidget( regionsSlider, 3, 2 ); 00117 // controlsGrid->addWidget( regionsIcon, 4, 2 ); 00118 00119 //make sure sliders have enough space so all slider units are settable 00120 controlsGrid->setRowSpacing( 3, 2*SLIDER_RADIUS + 5) ; 00121 00122 controlsGrid->setRowStretch( 5, 1 ); 00123 controlsGrid->setSpacing( WIDGET_SPACING ); 00124 00125 controlsGrid->setColStretch( 0, 1 ); 00126 controlsGrid->setColStretch( 3, 1 ); 00127 //-------------- 00128 //Dialog buttons: 00129 buttonsFrame = new QFrame( visibleFrame, "dialogButtons" ); 00130 00131 QPushButton* applyButton = new QPushButton( tr("Apply"), buttonsFrame ); 00132 applyButton->setDefault(true); 00133 applyButton->setFocus(); 00134 connect( applyButton, SIGNAL(clicked()), SLOT(applyAction()) ); 00135 00136 QPushButton* cancelButton = new QPushButton( tr("Cancel"), buttonsFrame ); 00137 connect( cancelButton, SIGNAL(clicked()), SLOT(reject()) ); 00138 00139 QPushButton* resetButton = new QPushButton( tr("Reset"), buttonsFrame ); 00140 connect( resetButton, SIGNAL(clicked()), SLOT(resetAction()) ); 00141 00142 QGridLayout* buttonsGrid = new QGridLayout( buttonsFrame, 1, 5, 0 ); 00143 buttonsGrid->setColStretch( 0, 1 ); 00144 buttonsGrid->addWidget( applyButton, 0, 1 ); 00145 buttonsGrid->addWidget( cancelButton, 0, 2 ); 00146 buttonsGrid->addWidget( resetButton, 0, 3 ); 00147 buttonsGrid->setColStretch( 4, 1 ); 00148 buttonsGrid->setSpacing( WIDGET_SPACING ); 00149 //-------------- 00150 //Top level grid 00151 QGridLayout* mainGrid = new QGridLayout( visibleFrame, 3, 2, 0 ); 00152 00153 mainGrid->addWidget( previewInterface, 0,0 ); 00154 mainGrid->addWidget( previewSelection, 1,0, Qt::AlignHCenter ); 00155 00156 mainGrid->addMultiCellWidget( controlsFrame, 0,1, 1,1 ); 00157 00158 mainGrid->addMultiCellWidget( buttonsFrame, 2,2, 0,1 ); 00159 00160 mainGrid->setRowStretch( 0, 1 ); 00161 mainGrid->setColStretch( 0, 1 ); 00162 00163 mainGrid->setSpacing( WIDGET_SPACING ); 00164 mainGrid->setMargin( WIDGET_SPACING ); 00165 00166 00167 QGridLayout* invisibleGrid = new QGridLayout( this, 2, 1, 0 ); 00168 invisibleGrid->addWidget( visibleFrame, 0, 0 ); 00169 invisibleGrid->setRowStretch( 0, 1 ); 00170 00171 //PLATFORM_SPECIFIC_CODE 00172 //windows users expect a grip, but qt doesn't put one in by default. we'll add 00173 //it for them too. :-) 00174 #if defined(Q_OS_WIN) 00175 QSizeGrip* sizeGrip = new QSizeGrip( this ); 00176 invisibleGrid->addWidget( sizeGrip, 1, 0, Qt::AlignRight | Qt::AlignBottom ); 00177 #endif 00178 00179 00180 00181 00182 //-------------- 00183 //Window caption 00184 setCaption( tr("Grain Editor") ); 00185 //------------------------------- 00186 }
GrainEditor::~GrainEditor | ( | ) |
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().
00263 { 00264 //no adjustment - don't change the image at all 00265 if( boundariesSlider->value() == 0 )//&& 00266 //regionsSlider->value() == 0 ) 00267 { return; } 00268 00269 //compute sigma 00270 float boundariesSigma; 00271 if( boundariesSlider->value() < 0 ) 00272 boundariesSigma = (80.0f * QABS(boundariesSlider->value()) ) / 255.0f; 00273 else 00274 boundariesSigma = (25.5f * QABS(boundariesSlider->value()) ) / 255.0f; 00275 // float regionsSigma = (20.0f * QABS(regionsSlider->value()) ) / 255.0f; 00276 00277 00278 //sharpen 00279 if ( boundariesSlider->value() < 0 ) 00280 { 00281 sharpenImage( image, boundariesSigma, 00282 offset, origImageSize, 00283 &edgesImage, true ); 00284 } 00285 //blur 00286 else if( boundariesSlider->value() > 0 ) 00287 { 00288 blurImage( image, boundariesSigma ); 00289 } 00290 00291 /* 00292 //sharpen boundaries 00293 if ( boundariesSlider->value() < 0 ) 00294 { 00295 sharpenImage( image, boundariesSigma, 00296 offset, origImageSize, 00297 &edgesImage, true ); 00298 } 00299 //blur boundaries 00300 else if( boundariesSlider->value() > 0 ) 00301 { 00302 blurImage( image, boundariesSigma, 00303 offset, origImageSize, 00304 &edgesImage, NULL, numRegions, true ); 00305 } 00306 00307 //sharpen regions 00308 if ( regionsSlider->value() < 0 ) 00309 { 00310 sharpenImage( image, regionsSigma, 00311 offset, origImageSize, 00312 &edgesImage, false ); 00313 } 00314 //blur regions 00315 else if( regionsSlider->value() > 0 ) 00316 { 00317 blurImage( image, regionsSigma, 00318 offset, origImageSize, 00319 &edgesImage, clusterMap, numRegions, false ); 00320 } 00321 */ 00322 00323 }
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().
00191 { 00192 //check if user has adjusted grain. 00193 //if any changes have taken place call "accept", else "reject" so image is not 00194 //updated and appear modified 00195 if( boundariesSlider->value() != 0 ) 00196 //|| 00197 // regionsSlider->value() != 0 ) 00198 { accept(); } 00199 else 00200 { reject(); } 00201 }
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().
00250 { 00251 //get original image 00252 QImage origImage = previewInterface->getOrigImage(); 00253 00254 //construct adjusted image 00255 QImage adjustedImage = origImage.copy(); 00256 adjustImage( adjustedImage, previewInterface->getSelection().topLeft() ); 00257 00258 //set adjusted image 00259 previewInterface->setAdjustedImage( adjustedImage ); 00260 }
QImage * GrainEditor::getModifiedImage | ( | ) |
get modified image that resulted from adjustments
Definition at line 219 of file grainEditor.cpp.
References adjustImage(), and fileName.
00220 { 00221 QImage* adjustedImage = new QImage(fileName); 00222 00223 //convert to 32-bit depth if necessary 00224 if( adjustedImage->depth() < 32 ) 00225 { 00226 QImage* tmp = adjustedImage; 00227 adjustedImage = new QImage( tmp->convertDepth( 32, Qt::AutoColor ) ); 00228 delete tmp; tmp=NULL; 00229 } 00230 00231 adjustImage( *adjustedImage, QPoint(0,0) ); 00232 return adjustedImage; 00233 }
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().
00326 { 00327 if(e->key() == Qt::Key_Control ) 00328 { 00329 PREVIEW_MODE curMode = (PREVIEW_MODE) previewSelection->currentItem(); 00330 if(curMode == ORIGINAL_IMAGE) 00331 previewInterface->setPreviewMode( ADJUSTED_IMAGE, true ); 00332 else if(curMode == ADJUSTED_IMAGE) 00333 previewInterface->setPreviewMode( ORIGINAL_IMAGE, true ); 00334 else 00335 previewInterface->setPreviewMode( INV_SPLIT_VIEW ); 00336 } 00337 else { QDialog::keyPressEvent(e); } 00338 }
void GrainEditor::keyReleaseEvent | ( | QKeyEvent * | e | ) | [protected] |
Definition at line 340 of file grainEditor.cpp.
References previewInterface, previewSelection, and SplitViewInterface::setPreviewMode().
00341 { 00342 if(e->key() == Qt::Key_Control ) 00343 { 00344 previewInterface->setPreviewMode( (PREVIEW_MODE) previewSelection->currentItem(), 00345 false ); 00346 } 00347 else { QDialog::keyReleaseEvent(e); } 00348 }
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().
00241 { 00242 //reset selected region in selection placement interface 00243 selectionPlacementInterface->setSelectedRegion( previewInterface->getSelection() ); 00244 00245 //regenerate adjusted image and repaint 00246 generateAdjustedPreviewImage(); 00247 }
void GrainEditor::resetAction | ( | ) | [private, slot] |
resets image grain to original state
Definition at line 213 of file grainEditor.cpp.
References boundariesSlider.
Referenced by GrainEditor().
00214 { 00215 boundariesSlider->setValue( 0 ); 00216 //regionsSlider->setValue( 0 ); 00217 }
void GrainEditor::resetBoundaries | ( | ) | [private, slot] |
reset blur/sharpen of object boundaries
Definition at line 203 of file grainEditor.cpp.
References boundariesSlider.
Referenced by GrainEditor().
00204 { 00205 boundariesSlider->setValue( 0 ); 00206 }
void GrainEditor::resetRegions | ( | ) | [private, slot] |
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().
00236 { 00237 previewInterface->setPreviewMode( (PREVIEW_MODE)selection ); 00238 }
ClickableLabel* GrainEditor::boundariesIcon [private] |
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] |
int* GrainEditor::clusterMap [private] |
QImage GrainEditor::edgesImage [private] |
QString GrainEditor::fileName [private] |
int GrainEditor::numRegions [private] |
QSize GrainEditor::origImageSize [private] |
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().