AlbumShaper  1.0a3
Public Member Functions | Protected Member Functions | Private Slots | Private Member Functions | Private Attributes
GrainEditor Class Reference

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

#include <grainEditor.h>

Inheritance diagram for GrainEditor:
Inheritance graph
[legend]
Collaboration diagram for GrainEditor:
Collaboration graph
[legend]

List of all members.

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
QFramebuttonsFrame
BlurSharpenSliderboundariesSlider
 Grain slider.
ClickableLabelboundariesIcon
BlurSharpenSliderregionsSlider
ClickableLabelregionsIcon

Detailed Description

Interface for adjusting image grain by bluring and sharpening.

Definition at line 31 of file grainEditor.h.


Constructor & Destructor Documentation

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.

{ }

Member Function Documentation

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]
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().


Member Data Documentation

Definition at line 101 of file grainEditor.h.

Referenced by GrainEditor().

Grain slider.

Definition at line 100 of file grainEditor.h.

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

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().

QComboBox* GrainEditor::previewSelection [private]

Definition at line 96 of file grainEditor.h.

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

Definition at line 104 of file grainEditor.h.

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().


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