Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Contrast enhancement functions for multiband color renderer widget
  • Loading branch information
mhugent committed Mar 14, 2012
1 parent 267c1e2 commit de15835
Show file tree
Hide file tree
Showing 7 changed files with 252 additions and 62 deletions.
18 changes: 18 additions & 0 deletions src/core/raster/qgsmultibandcolorrenderer.cpp
Expand Up @@ -33,6 +33,24 @@ QgsMultiBandColorRenderer::QgsMultiBandColorRenderer( QgsRasterDataProvider* pro

QgsMultiBandColorRenderer::~QgsMultiBandColorRenderer()
{
delete mRedContrastEnhancement;
delete mGreenContrastEnhancement;
delete mBlueContrastEnhancement;
}

void QgsMultiBandColorRenderer::setRedContrastEnhancement( QgsContrastEnhancement* ce )
{
delete mRedContrastEnhancement; mRedContrastEnhancement = ce;
}

void QgsMultiBandColorRenderer::setGreenContrastEnhancement( QgsContrastEnhancement* ce )
{
delete mGreenContrastEnhancement; mGreenContrastEnhancement = ce;
}

void QgsMultiBandColorRenderer::setBlueContrastEnhancement( QgsContrastEnhancement* ce )
{
delete mBlueContrastEnhancement; mBlueContrastEnhancement = ce;
}

QgsRasterRenderer* QgsMultiBandColorRenderer::create( const QDomElement& elem )
Expand Down
9 changes: 6 additions & 3 deletions src/core/raster/qgsmultibandcolorrenderer.h
Expand Up @@ -44,13 +44,16 @@ class QgsMultiBandColorRenderer: public QgsRasterRenderer
void setBlueBand( int band ) { mBlueBand = band; }

const QgsContrastEnhancement* redContrastEnhancement() const { return mRedContrastEnhancement; }
void setRedContrastEnhancement( QgsContrastEnhancement* ce ) { mRedContrastEnhancement = ce; }
/**Takes ownership*/
void setRedContrastEnhancement( QgsContrastEnhancement* ce );

const QgsContrastEnhancement* greenContrastEnhancement() const { return mGreenContrastEnhancement; }
void setGreenContrastEnhancement( QgsContrastEnhancement* ce ) { mGreenContrastEnhancement = ce; }
/**Takes ownership*/
void setGreenContrastEnhancement( QgsContrastEnhancement* ce );

const QgsContrastEnhancement* blueContrastEnhancement() const { return mBlueContrastEnhancement; }
void setBlueContrastEnhancement( QgsContrastEnhancement* ce ) { mBlueContrastEnhancement = ce; }
/**Takes ownership*/
void setBlueContrastEnhancement( QgsContrastEnhancement* ce );

private:
int mRedBand;
Expand Down
30 changes: 27 additions & 3 deletions src/core/raster/qgsrasterlayer.cpp
Expand Up @@ -696,7 +696,15 @@ void QgsRasterLayer::setRendererForDrawingStyle( const DrawingStyle & theDrawin
red = bandNumber( mRedBandName );
if ( contrastEnhancementAlgorithm() != QgsContrastEnhancement::NoEnhancement )
{
redEnhancement = contrastEnhancement( red );
QgsContrastEnhancement* bkRedEnhancement = contrastEnhancement( red );
if ( bkRedEnhancement )
{
redEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )(
mDataProvider->dataType( red ) ) );
redEnhancement->setMinimumValue( bkRedEnhancement->minimumValue() );
redEnhancement->setMaximumValue( bkRedEnhancement->maximumValue() );
redEnhancement->setContrastEnhancementAlgorithm( contrastEnhancementAlgorithm() );
}
}
}
int green = -1;
Expand All @@ -706,7 +714,15 @@ void QgsRasterLayer::setRendererForDrawingStyle( const DrawingStyle & theDrawin
green = bandNumber( mGreenBandName );
if ( contrastEnhancementAlgorithm() != QgsContrastEnhancement::NoEnhancement )
{
greenEnhancement = contrastEnhancement( green );
QgsContrastEnhancement* bkGreenEnhancement = contrastEnhancement( green );
if ( bkGreenEnhancement )
{
greenEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )(
mDataProvider->dataType( green ) ) );
greenEnhancement->setMinimumValue( bkGreenEnhancement->minimumValue() );
greenEnhancement->setMaximumValue( bkGreenEnhancement->maximumValue() );
greenEnhancement->setContrastEnhancementAlgorithm( contrastEnhancementAlgorithm() );
}
}
}
int blue = -1;
Expand All @@ -716,7 +732,15 @@ void QgsRasterLayer::setRendererForDrawingStyle( const DrawingStyle & theDrawin
blue = bandNumber( mBlueBandName );
if ( contrastEnhancementAlgorithm() != QgsContrastEnhancement::NoEnhancement )
{
blueEnhancement = contrastEnhancement( blue );
QgsContrastEnhancement* bkBlueEnhancement = contrastEnhancement( blue );
if ( bkBlueEnhancement )
{
blueEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )(
mDataProvider->dataType( blue ) ) );
blueEnhancement->setMinimumValue( bkBlueEnhancement->minimumValue() );
blueEnhancement->setMaximumValue( bkBlueEnhancement->maximumValue() );
blueEnhancement->setContrastEnhancementAlgorithm( contrastEnhancementAlgorithm() );
}
}
}
renderer = new QgsMultiBandColorRenderer( mDataProvider, red, green, blue,
Expand Down
114 changes: 109 additions & 5 deletions src/gui/raster/qgsmultibandcolorrendererwidget.cpp
Expand Up @@ -22,6 +22,7 @@
QgsMultiBandColorRendererWidget::QgsMultiBandColorRendererWidget( QgsRasterLayer* layer ): QgsRasterRendererWidget( layer )
{
setupUi( this );
createValidators();

if ( mRasterLayer )
{
Expand All @@ -36,6 +37,12 @@ QgsMultiBandColorRendererWidget::QgsMultiBandColorRendererWidget( QgsRasterLayer
mGreenBandComboBox->addItem( tr( "Not set" ), -1 );
mBlueBandComboBox->addItem( tr( "Not set" ), -1 );

//contrast enhancement algorithms
mContrastEnhancementAlgorithmComboBox->addItem( tr( "No enhancement" ), 0 );
mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch to MinMax" ), 1 );
mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch and clip to MinMax" ), 2 );
mContrastEnhancementAlgorithmComboBox->addItem( tr( "Clip to MinMax" ), 3 );

int nBands = provider->bandCount();
for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1
{
Expand Down Expand Up @@ -66,9 +73,106 @@ QgsMultiBandColorRendererWidget::~QgsMultiBandColorRendererWidget()

QgsRasterRenderer* QgsMultiBandColorRendererWidget::renderer()
{
return new QgsMultiBandColorRenderer( mRasterLayer->dataProvider(),
mRedBandComboBox->itemData( mRedBandComboBox->currentIndex() ).toInt(),
mGreenBandComboBox->itemData( mGreenBandComboBox->currentIndex() ).toInt(),
mBlueBandComboBox->itemData( mBlueBandComboBox->currentIndex() ).toInt()
);
if ( !mRasterLayer )
{
return 0;
}
QgsRasterDataProvider* provider = mRasterLayer->dataProvider();
if ( !provider )
{
return 0;
}

int redBand = mRedBandComboBox->itemData( mRedBandComboBox->currentIndex() ).toInt();
int greenBand = mGreenBandComboBox->itemData( mGreenBandComboBox->currentIndex() ).toInt();
int blueBand = mBlueBandComboBox->itemData( mBlueBandComboBox->currentIndex() ).toInt();

QgsMultiBandColorRenderer* r = new QgsMultiBandColorRenderer( provider, redBand, greenBand, blueBand );
setCustomMinMaxValues( r, provider, redBand, greenBand, blueBand );
return r;
}

void QgsMultiBandColorRendererWidget::createValidators()
{
mRedMinLineEdit->setValidator( new QDoubleValidator( mRedMinLineEdit ) );
mRedMaxLineEdit->setValidator( new QDoubleValidator( mRedMinLineEdit ) );
mGreenMinLineEdit->setValidator( new QDoubleValidator( mGreenMinLineEdit ) );
mGreenMaxLineEdit->setValidator( new QDoubleValidator( mGreenMinLineEdit ) );
mBlueMinLineEdit->setValidator( new QDoubleValidator( mBlueMinLineEdit ) );
mBlueMaxLineEdit->setValidator( new QDoubleValidator( mBlueMinLineEdit ) );
}

void QgsMultiBandColorRendererWidget::setCustomMinMaxValues( QgsMultiBandColorRenderer* r,
const QgsRasterDataProvider* provider,
int redBand, int greenBand, int blueBand )
{
if ( !r || !provider )
{
return;
}

if ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ==
QgsContrastEnhancement::NoEnhancement )
{
r->setRedContrastEnhancement( 0 );
r->setGreenContrastEnhancement( 0 );
r->setBlueContrastEnhancement( 0 );
return;
}

QgsContrastEnhancement* redEnhancement = 0;
QgsContrastEnhancement* greenEnhancement = 0;
QgsContrastEnhancement* blueEnhancement = 0;

bool redMinOk, redMaxOk;
double redMin = mRedMinLineEdit->text().toDouble( &redMinOk );
double redMax = mRedMaxLineEdit->text().toDouble( &redMaxOk );
if ( redMinOk && redMaxOk )
{
redEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )(
provider->dataType( redBand ) ) );
redEnhancement->setMinimumValue( redMin );
redEnhancement->setMaximumValue( redMax );
}

bool greenMinOk, greenMaxOk;
double greenMin = mGreenMinLineEdit->text().toDouble( &greenMinOk );
double greenMax = mGreenMaxLineEdit->text().toDouble( &greenMaxOk );
if ( greenMinOk && greenMaxOk )
{
greenEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )(
provider->dataType( greenBand ) ) );
greenEnhancement->setMinimumValue( greenMin );
greenEnhancement->setMaximumValue( greenMax );
}

bool blueMinOk, blueMaxOk;
double blueMin = mBlueMinLineEdit->text().toDouble( &blueMinOk );
double blueMax = mBlueMaxLineEdit->text().toDouble( &blueMaxOk );
if ( blueMinOk && blueMaxOk )
{
blueEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )(
provider->dataType( blueBand ) ) );
blueEnhancement->setMinimumValue( blueMin );
blueEnhancement->setMaximumValue( blueMax );
}

if ( redEnhancement )
{
redEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm )
( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) );
}
if ( greenEnhancement )
{
greenEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm )
( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) );
}
if ( blueEnhancement )
{
blueEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm )
( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) );
}
r->setRedContrastEnhancement( redEnhancement );
r->setGreenContrastEnhancement( greenEnhancement );
r->setBlueContrastEnhancement( blueEnhancement );
}
7 changes: 7 additions & 0 deletions src/gui/raster/qgsmultibandcolorrendererwidget.h
Expand Up @@ -21,7 +21,9 @@
#include "qgsrasterrendererwidget.h"
#include "ui_qgsmultibandcolorrendererwidgetbase.h"

class QgsRasterDataProvider;
class QgsRasterLayer;
class QgsMultiBandColorRenderer;

class QgsMultiBandColorRendererWidget: public QgsRasterRendererWidget, private Ui::QgsMultiBandColorRendererWidgetBase
{
Expand All @@ -33,6 +35,11 @@ class QgsMultiBandColorRendererWidget: public QgsRasterRendererWidget, private U
~QgsMultiBandColorRendererWidget();

QgsRasterRenderer* renderer();

private:
void createValidators();
void setCustomMinMaxValues( QgsMultiBandColorRenderer* r, const QgsRasterDataProvider* provider, int redBand, int GreenBand,
int blueBand );
};

#endif // QGSMULTIBANDCOLORRENDERERWIDGET_H
2 changes: 2 additions & 0 deletions src/gui/raster/qgssinglebandgrayrendererwidget.cpp
Expand Up @@ -22,6 +22,8 @@
QgsSingleBandGrayRendererWidget::QgsSingleBandGrayRendererWidget( QgsRasterLayer* layer ): QgsRasterRendererWidget( layer )
{
setupUi( this );
mMinLineEdit->setValidator( new QDoubleValidator( mMinLineEdit ) );
mMaxLineEdit->setValidator( new QDoubleValidator( mMaxLineEdit ) );

if ( mRasterLayer )
{
Expand Down

0 comments on commit de15835

Please sign in to comment.