AlbumShaper 1.0a3
GrainEditor Class Reference

Interface for adjusting image grain by bluring and sharpening. More...

#include <grainEditor.h>

Inheritance diagram for GrainEditor:
Collaboration diagram for GrainEditor:

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
 
PanningPreviewInterfacepreviewInterface
 Preview image.
 
SelectionPlacementInterfaceselectionPlacementInterface
 Interface for placing selection.
 
QComboBox * previewSelection
 
Q3FramebuttonsFrame
 
BlurSharpenSliderboundariesSlider
 Grain slider.
 
ClickableLabelboundariesIcon
 
BlurSharpenSliderregionsSlider
 
ClickableLabelregionsIcon
 

Detailed Description

Interface for adjusting image grain by bluring and sharpening.

Definition at line 34 of file grainEditor.h.

Constructor & Destructor Documentation

◆ GrainEditor()

GrainEditor::GrainEditor ( QString filename,
QWidget * parent = 0,
const char * name = 0 )

Constructs layout.

Definition at line 40 of file grainEditor.cpp.

40 : QDialog(parent,name,true)
41{
42 //record filename
43 this->fileName = fileName;
44
45 //record original image size
47
48 //construct edges image
49 //speed up edge finding by scaling image down to < 800x600
50 scaleImage( fileName, edgesImage, 512, 384 );
51 EdgeDetect detector( &edgesImage );
52 clusterMap = detector.getClusterMap();
53 numRegions = detector.getNumClusters();
54
55 Q3Frame* visibleFrame = new Q3Frame( this, "visible widgets" );
56 //--------------
57 //Preview frame
59 visibleFrame, "previewInterface" );
60 previewSelection = new QComboBox( visibleFrame, "previewSelction" );
61 previewSelection->insertItem( tr("Split View") );
62 previewSelection->insertItem( tr("Original Image") );
63 previewSelection->insertItem( tr("Adjusted Image") );
64 connect( previewSelection, SIGNAL(activated(int)), this, SLOT(selectPreviewImageType(int)) );
65 //--------------
66 //Controls frame
67 Q3Frame* controlsFrame = new Q3Frame( visibleFrame, "controlsFrame" );
68
69 QLabel* selectionLabel = new QLabel( tr("Region Shown in Detail:"),
70 controlsFrame, "selectionLabel" );
71
73 controlsFrame,
74 "selectionPlacementInterface" );
75 //--
76 connect( previewInterface, SIGNAL( selectionChanged() ),
77 this, SLOT( previewResized() ) );
78 connect( selectionPlacementInterface, SIGNAL(placementChanged(QRect)),
79 previewInterface, SLOT(setSelection(QRect)) );
80 //--
81 boundariesSlider = new BlurSharpenSlider( Qt::Vertical, controlsFrame );
82 boundariesSlider->setMinValue( -SLIDER_RADIUS );
83 boundariesSlider->setMaxValue( SLIDER_RADIUS );
84 connect( boundariesSlider, SIGNAL(valueChanged(int)),
85 this, SLOT(generateAdjustedPreviewImage()) );
86
87 boundariesIcon = new ClickableLabel( controlsFrame, "boundariesIcon" );
88 connect( boundariesIcon, SIGNAL(clicked()), SLOT(resetBoundaries()) );
89
90// boundariesIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/boundaries.png") );
91// QToolTip::add( boundariesSlider, tr("Blur/sharpen boundaries") );
92// QToolTip::add( boundariesIcon, tr("Reset boundaries") );
93 boundariesIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/blurSharpen.png") );
94 QToolTip::add( boundariesSlider, tr("Blur/Sharpen Image") );
95 QToolTip::add( boundariesIcon, tr("Reset") );
96 //--
97 /*
98 regionsSlider = new QSlider(Qt::Vertical, controlsFrame );
99 regionsSlider->setMinValue( -SLIDER_RADIUS );
100 regionsSlider->setMaxValue( SLIDER_RADIUS );
101 connect( regionsSlider, SIGNAL(valueChanged(int)),
102 this, SLOT(generateAdjustedPreviewImage()) );
103 QToolTip::add( regionsSlider, tr("Blur/sharpen regions") );
104
105 regionsIcon = new ClickableLabel( controlsFrame, "regionsIcon" );
106 regionsIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/regions.png") );
107 connect( regionsIcon, SIGNAL(clicked()), SLOT(resetRegions()) );
108 QToolTip::add( regionsIcon, tr("Reset regions") );
109 */
110 //--
111 Q3GridLayout* controlsGrid = new Q3GridLayout( controlsFrame, 6, 4, 0 );
112 controlsGrid->setRowStretch( 0, 1 );
113
114 controlsGrid->addMultiCellWidget( selectionLabel, 1,1, 0,3 );
115 controlsGrid->addMultiCellWidget( selectionPlacementInterface, 2,2, 0,3 );
116
117 controlsGrid->addWidget( boundariesSlider, 3, 1 );
118 controlsGrid->addWidget( boundariesIcon, 4, 1 );
119
120// controlsGrid->addWidget( regionsSlider, 3, 2 );
121// controlsGrid->addWidget( regionsIcon, 4, 2 );
122
123 //make sure sliders have enough space so all slider units are settable
124 controlsGrid->setRowSpacing( 3, 2*SLIDER_RADIUS + 5) ;
125
126 controlsGrid->setRowStretch( 5, 1 );
127 controlsGrid->setSpacing( WIDGET_SPACING );
128
129 controlsGrid->setColStretch( 0, 1 );
130 controlsGrid->setColStretch( 3, 1 );
131 //--------------
132 //Dialog buttons:
133 buttonsFrame = new Q3Frame( visibleFrame, "dialogButtons" );
134
135 QPushButton* applyButton = new QPushButton( tr("Apply"), buttonsFrame );
136 applyButton->setDefault(true);
137 applyButton->setFocus();
138 connect( applyButton, SIGNAL(clicked()), SLOT(applyAction()) );
139
140 QPushButton* cancelButton = new QPushButton( tr("Cancel"), buttonsFrame );
141 connect( cancelButton, SIGNAL(clicked()), SLOT(reject()) );
142
143 QPushButton* resetButton = new QPushButton( tr("Reset"), buttonsFrame );
144 connect( resetButton, SIGNAL(clicked()), SLOT(resetAction()) );
145
146 Q3GridLayout* buttonsGrid = new Q3GridLayout( buttonsFrame, 1, 5, 0 );
147 buttonsGrid->setColStretch( 0, 1 );
148 buttonsGrid->addWidget( applyButton, 0, 1 );
149 buttonsGrid->addWidget( cancelButton, 0, 2 );
150 buttonsGrid->addWidget( resetButton, 0, 3 );
151 buttonsGrid->setColStretch( 4, 1 );
152 buttonsGrid->setSpacing( WIDGET_SPACING );
153 //--------------
154 //Top level grid
155 Q3GridLayout* mainGrid = new Q3GridLayout( visibleFrame, 3, 2, 0 );
156
157 mainGrid->addWidget( previewInterface, 0,0 );
158 mainGrid->addWidget( previewSelection, 1,0, Qt::AlignHCenter );
159
160 mainGrid->addMultiCellWidget( controlsFrame, 0,1, 1,1 );
161
162 mainGrid->addMultiCellWidget( buttonsFrame, 2,2, 0,1 );
163
164 mainGrid->setRowStretch( 0, 1 );
165 mainGrid->setColStretch( 0, 1 );
166
167 mainGrid->setSpacing( WIDGET_SPACING );
168 mainGrid->setMargin( WIDGET_SPACING );
169
170
171 Q3GridLayout* invisibleGrid = new Q3GridLayout( this, 2, 1, 0 );
172 invisibleGrid->addWidget( visibleFrame, 0, 0 );
173 invisibleGrid->setRowStretch( 0, 1 );
174
175 //PLATFORM_SPECIFIC_CODE
176 //windows users expect a grip, but qt doesn't put one in by default. we'll add
177 //it for them too. :-)
178#if defined(Q_OS_WIN)
179 QSizeGrip* sizeGrip = new QSizeGrip( this );
180 invisibleGrid->addWidget( sizeGrip, 1, 0, Qt::AlignRight | Qt::AlignBottom );
181#endif
182
183
184
185
186 //--------------
187 //Window caption
188 setCaption( tr("Grain Editor") );
189 //-------------------------------
190}
A clickable label.
void setPixmap(const QPixmap &p)
ClickableLabel * boundariesIcon
void previewResized()
handle resize preview signals
PanningPreviewInterface * previewInterface
Preview image.
Definition grainEditor.h:94
int * clusterMap
Definition grainEditor.h:90
BlurSharpenSlider * boundariesSlider
Grain slider.
void resetBoundaries()
reset blur/sharpen of object boundaries
void applyAction()
check for changes to settings, if so
QSize origImageSize
Definition grainEditor.h:84
void resetAction()
resets image grain to original state
QString fileName
Definition grainEditor.h:81
QComboBox * previewSelection
Definition grainEditor.h:99
Q3Frame * buttonsFrame
void generateAdjustedPreviewImage()
generate and set adjusted image
void selectPreviewImageType(int selection)
updates preview image
SelectionPlacementInterface * selectionPlacementInterface
Interface for placing selection.
Definition grainEditor.h:97
QImage edgesImage
Definition grainEditor.h:87
A selection region placement interface.
QString IMAGE_PATH
Definition config.cpp:18
#define WIDGET_SPACING
Definition config.h:31
#define SLIDER_RADIUS
bool scaleImage(QString fileIn, QString fileOut, int newWidth, int newHeight)
Scale image and save copy to disk.
bool getImageSize(const char *filename, QSize &size)
Get image dimensions.

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.

◆ ~GrainEditor()

GrainEditor::~GrainEditor ( )

Definition at line 192 of file grainEditor.cpp.

192{ }

Member Function Documentation

◆ adjustImage()

void GrainEditor::adjustImage ( QImage & image,
QPoint offset )
private

Definition at line 266 of file grainEditor.cpp.

267{
268 //no adjustment - don't change the image at all
269 if( boundariesSlider->value() == 0 )//&&
270 //regionsSlider->value() == 0 )
271 { return; }
272
273 //compute sigma
274 float boundariesSigma;
275 if( boundariesSlider->value() < 0 )
276 boundariesSigma = (80.0f * QABS(boundariesSlider->value()) ) / 255.0f;
277 else
278 boundariesSigma = (25.5f * QABS(boundariesSlider->value()) ) / 255.0f;
279// float regionsSigma = (20.0f * QABS(regionsSlider->value()) ) / 255.0f;
280
281
282 //sharpen
283 if ( boundariesSlider->value() < 0 )
284 {
285 sharpenImage( image, boundariesSigma,
286 offset, origImageSize,
287 &edgesImage, true );
288 }
289 //blur
290 else if( boundariesSlider->value() > 0 )
291 {
292 blurImage( image, boundariesSigma );
293 }
294
295 /*
296 //sharpen boundaries
297 if ( boundariesSlider->value() < 0 )
298 {
299 sharpenImage( image, boundariesSigma,
300 offset, origImageSize,
301 &edgesImage, true );
302 }
303 //blur boundaries
304 else if( boundariesSlider->value() > 0 )
305 {
306 blurImage( image, boundariesSigma,
307 offset, origImageSize,
308 &edgesImage, NULL, numRegions, true );
309 }
310
311 //sharpen regions
312 if ( regionsSlider->value() < 0 )
313 {
314 sharpenImage( image, regionsSigma,
315 offset, origImageSize,
316 &edgesImage, false );
317 }
318 //blur regions
319 else if( regionsSlider->value() > 0 )
320 {
321 blurImage( image, regionsSigma,
322 offset, origImageSize,
323 &edgesImage, clusterMap, numRegions, false );
324 }
325 */
326
327}
void blurImage(QImage &image, float sigma)
Definition blur.cpp:94
void sharpenImage(QImage &image, float sigma, QPoint offset, QSize fullImageRes, QImage *edgeImage, bool blurEdges)
Definition sharpen.cpp:95

References blurImage(), boundariesSlider, edgesImage, origImageSize, and sharpenImage().

Referenced by generateAdjustedPreviewImage(), and getModifiedImage().

◆ applyAction

void GrainEditor::applyAction ( )
privateslot

check for changes to settings, if so

Definition at line 194 of file grainEditor.cpp.

195{
196 //check if user has adjusted grain.
197 //if any changes have taken place call "accept", else "reject" so image is not
198 //updated and appear modified
199 if( boundariesSlider->value() != 0 )
200 //||
201 // regionsSlider->value() != 0 )
202 { accept(); }
203 else
204 { reject(); }
205}

References boundariesSlider.

Referenced by GrainEditor().

◆ generateAdjustedPreviewImage

void GrainEditor::generateAdjustedPreviewImage ( )
privateslot

generate and set adjusted image

Definition at line 253 of file grainEditor.cpp.

254{
255 //get original image
256 QImage origImage = previewInterface->getOrigImage();
257
258 //construct adjusted image
259 QImage adjustedImage = origImage.copy();
260 adjustImage( adjustedImage, previewInterface->getSelection().topLeft() );
261
262 //set adjusted image
263 previewInterface->setAdjustedImage( adjustedImage );
264}
void adjustImage(QImage &image, QPoint offset)
QImage & getOrigImage()
returns orig image object
void setAdjustedImage(QImage adjustedImage)
sets adjusted image and repaints

References adjustImage(), SplitViewInterface::getOrigImage(), PanningPreviewInterface::getSelection(), previewInterface, and SplitViewInterface::setAdjustedImage().

Referenced by GrainEditor(), and previewResized().

◆ getModifiedImage()

QImage * GrainEditor::getModifiedImage ( )

get modified image that resulted from adjustments

Definition at line 223 of file grainEditor.cpp.

224{
225 QImage* adjustedImage = new QImage(fileName);
226
227 //convert to 32-bit depth if necessary
228 if( adjustedImage->depth() < 32 )
229 {
230 QImage* tmp = adjustedImage;
231 adjustedImage = new QImage( tmp->convertDepth( 32, Qt::AutoColor ) );
232 delete tmp; tmp=NULL;
233 }
234
235 adjustImage( *adjustedImage, QPoint(0,0) );
236 return adjustedImage;
237}

References adjustImage(), and fileName.

Referenced by EditingInterface::adjustGrain().

◆ keyPressEvent()

void GrainEditor::keyPressEvent ( QKeyEvent * e)
protected

Definition at line 329 of file grainEditor.cpp.

330{
331 if(e->key() == Qt::Key_Control )
332 {
333 PREVIEW_MODE curMode = (PREVIEW_MODE) previewSelection->currentItem();
334 if(curMode == ORIGINAL_IMAGE)
336 else if(curMode == ADJUSTED_IMAGE)
338 else
340 }
341 else { QDialog::keyPressEvent(e); }
342}
void setPreviewMode(PREVIEW_MODE mode, bool forceDrawLabel=false)
Sets preview mode.
PREVIEW_MODE
current preview mode
@ ORIGINAL_IMAGE
@ ADJUSTED_IMAGE
@ INV_SPLIT_VIEW

References ADJUSTED_IMAGE, INV_SPLIT_VIEW, ORIGINAL_IMAGE, previewInterface, previewSelection, and SplitViewInterface::setPreviewMode().

◆ keyReleaseEvent()

void GrainEditor::keyReleaseEvent ( QKeyEvent * e)
protected

Definition at line 344 of file grainEditor.cpp.

345{
346 if(e->key() == Qt::Key_Control )
347 {
349 false );
350 }
351 else { QDialog::keyReleaseEvent(e); }
352}

References previewInterface, previewSelection, and SplitViewInterface::setPreviewMode().

◆ previewResized

void GrainEditor::previewResized ( )
privateslot

handle resize preview signals

Definition at line 244 of file grainEditor.cpp.

245{
246 //reset selected region in selection placement interface
248
249 //regenerate adjusted image and repaint
251}
void setSelectedRegion(QRect selection)
Set the select region using image space coordinates.

References generateAdjustedPreviewImage(), PanningPreviewInterface::getSelection(), previewInterface, selectionPlacementInterface, and SelectionPlacementInterface::setSelectedRegion().

Referenced by GrainEditor().

◆ resetAction

void GrainEditor::resetAction ( )
privateslot

resets image grain to original state

Definition at line 217 of file grainEditor.cpp.

218{
219 boundariesSlider->setValue( 0 );
220 //regionsSlider->setValue( 0 );
221}

References boundariesSlider.

Referenced by GrainEditor().

◆ resetBoundaries

void GrainEditor::resetBoundaries ( )
privateslot

reset blur/sharpen of object boundaries

Definition at line 207 of file grainEditor.cpp.

208{
209 boundariesSlider->setValue( 0 );
210}

References boundariesSlider.

Referenced by GrainEditor().

◆ resetRegions

void GrainEditor::resetRegions ( )
privateslot

reset blur/sharpen of regions

Definition at line 212 of file grainEditor.cpp.

213{
214 //regionsSlider->setValue( 0 );
215}

◆ selectPreviewImageType

void GrainEditor::selectPreviewImageType ( int selection)
privateslot

updates preview image

Definition at line 239 of file grainEditor.cpp.

240{
242}

References previewInterface, and SplitViewInterface::setPreviewMode().

Referenced by GrainEditor().

Member Data Documentation

◆ boundariesIcon

ClickableLabel* GrainEditor::boundariesIcon
private

Definition at line 104 of file grainEditor.h.

Referenced by GrainEditor().

◆ boundariesSlider

BlurSharpenSlider* GrainEditor::boundariesSlider
private

Grain slider.

Definition at line 103 of file grainEditor.h.

Referenced by adjustImage(), applyAction(), GrainEditor(), resetAction(), and resetBoundaries().

◆ buttonsFrame

Q3Frame* GrainEditor::buttonsFrame
private

Definition at line 100 of file grainEditor.h.

Referenced by GrainEditor().

◆ clusterMap

int* GrainEditor::clusterMap
private

Definition at line 90 of file grainEditor.h.

Referenced by GrainEditor().

◆ edgesImage

QImage GrainEditor::edgesImage
private

Definition at line 87 of file grainEditor.h.

Referenced by adjustImage(), and GrainEditor().

◆ fileName

QString GrainEditor::fileName
private

Definition at line 81 of file grainEditor.h.

Referenced by getModifiedImage(), and GrainEditor().

◆ numRegions

int GrainEditor::numRegions
private

Definition at line 91 of file grainEditor.h.

Referenced by GrainEditor().

◆ origImageSize

QSize GrainEditor::origImageSize
private

Definition at line 84 of file grainEditor.h.

Referenced by adjustImage(), and GrainEditor().

◆ previewInterface

PanningPreviewInterface* GrainEditor::previewInterface
private

◆ previewSelection

QComboBox* GrainEditor::previewSelection
private

Definition at line 99 of file grainEditor.h.

Referenced by GrainEditor(), keyPressEvent(), and keyReleaseEvent().

◆ regionsIcon

ClickableLabel* GrainEditor::regionsIcon
private

Definition at line 107 of file grainEditor.h.

◆ regionsSlider

BlurSharpenSlider* GrainEditor::regionsSlider
private

Definition at line 106 of file grainEditor.h.

◆ selectionPlacementInterface

SelectionPlacementInterface* GrainEditor::selectionPlacementInterface
private

Interface for placing selection.

Definition at line 97 of file grainEditor.h.

Referenced by GrainEditor(), and previewResized().


The documentation for this class was generated from the following files: