Skip to content

Commit 47bba04

Browse files
committedApr 13, 2012
Fix contrast enhancement buttons in raster branch
1 parent 9135c01 commit 47bba04

File tree

2 files changed

+102
-45
lines changed

2 files changed

+102
-45
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 95 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@
138138
#include "qgsmessageviewer.h"
139139
#include "qgsmimedatautils.h"
140140
#include "qgsmessagelog.h"
141+
#include "qgsmultibandcolorrenderer.h"
141142
#include "qgsnewvectorlayerdialog.h"
142143
#include "qgsoptions.h"
143144
#include "qgspastetransformations.h"
@@ -157,10 +158,12 @@
157158
#include "qgsrastercalcdialog.h"
158159
#include "qgsrasterlayer.h"
159160
#include "qgsrasterlayerproperties.h"
161+
#include "qgsrasterrenderer.h"
160162
#include "qgsrectangle.h"
161163
#include "qgsrenderer.h"
162164
#include "qgsscalecombobox.h"
163165
#include "qgsshortcutsmanager.h"
166+
#include "qgssinglebandgrayrenderer.h"
164167
#include "qgssnappingdialog.h"
165168
#include "qgssponsors.h"
166169
#include "qgstextannotationitem.h"
@@ -5056,6 +5059,11 @@ void QgisApp::options()
50565059
}
50575060

50585061
void QgisApp::fullHistogramStretch()
5062+
{
5063+
histogramStretch( false );
5064+
}
5065+
5066+
void QgisApp::histogramStretch( bool visibleAreaOnly )
50595067
{
50605068
QgsMapLayer * layer = mMapLegend->currentLayer();
50615069

@@ -5075,76 +5083,118 @@ void QgisApp::fullHistogramStretch()
50755083
tr( "To perform a full histogram stretch, you need to have a raster layer selected." ) );
50765084
return;
50775085
}
5078-
if ( rlayer->providerType() == "wms" )
5086+
5087+
QgsRasterDataProvider* provider = rlayer->dataProvider();
5088+
if ( !provider )
50795089
{
50805090
return;
50815091
}
5082-
if ( rlayer->drawingStyle() == QgsRasterLayer::SingleBandGray ||
5083-
rlayer->drawingStyle() == QgsRasterLayer::MultiBandSingleBandGray ||
5084-
rlayer->drawingStyle() == QgsRasterLayer::MultiBandColor
5085-
)
5092+
5093+
//get renderer
5094+
QgsRasterRenderer* renderer = rlayer->renderer();
5095+
if ( !renderer )
50865096
{
5087-
rlayer->setContrastEnhancementAlgorithm( "StretchToMinimumMaximum" );
5088-
rlayer->setMinimumMaximumUsingDataset();
5089-
rlayer->setCacheImage( NULL );
5090-
//refreshLayerSymbology( rlayer->getLayerID() );
5091-
mMapCanvas->refresh();
50925097
return;
50935098
}
5099+
5100+
//singleband gray <-> multiband color
5101+
if ( renderer->type() == "singlebandgray" )
5102+
{
5103+
QgsSingleBandGrayRenderer* grayRenderer = static_cast<QgsSingleBandGrayRenderer*>( renderer );
5104+
if ( !grayRenderer )
5105+
{
5106+
return;
5107+
}
5108+
5109+
//create new contrast enhancements
5110+
int grayBand = grayRenderer->grayBand();
5111+
if ( grayBand == -1 )
5112+
{
5113+
return;
5114+
}
5115+
5116+
QgsContrastEnhancement* e = rasterContrastEnhancement( rlayer, grayBand, visibleAreaOnly );
5117+
if ( !e )
5118+
{
5119+
return;
5120+
}
5121+
grayRenderer->setContrastEnhancement( e );
5122+
}
5123+
else if ( renderer->type() == "multibandcolor" )
5124+
{
5125+
QgsMultiBandColorRenderer* colorRenderer = static_cast<QgsMultiBandColorRenderer*>( renderer );
5126+
if ( !colorRenderer )
5127+
{
5128+
return;
5129+
}
5130+
5131+
QgsContrastEnhancement* redEnhancement = rasterContrastEnhancement( rlayer, colorRenderer->redBand(), visibleAreaOnly );
5132+
if ( redEnhancement )
5133+
{
5134+
colorRenderer->setRedContrastEnhancement( redEnhancement );
5135+
}
5136+
QgsContrastEnhancement* greenEnhancement = rasterContrastEnhancement( rlayer, colorRenderer->greenBand(), visibleAreaOnly );
5137+
if ( greenEnhancement )
5138+
{
5139+
colorRenderer->setGreenContrastEnhancement( greenEnhancement );
5140+
}
5141+
QgsContrastEnhancement* blueEnhancement = rasterContrastEnhancement( rlayer, colorRenderer->blueBand(), visibleAreaOnly );
5142+
if ( blueEnhancement )
5143+
{
5144+
colorRenderer->setBlueContrastEnhancement( blueEnhancement );
5145+
}
5146+
}
50945147
else
50955148
{
5096-
QMessageBox::information( this,
5097-
tr( "No Valid Raster Layer Selected" ),
5098-
tr( "To perform a local histogram stretch, you need to have a grayscale "
5099-
"or multiband (multiband single layer, singleband grayscale or multiband color) "
5100-
" raster layer selected." ) );
51015149
return;
51025150
}
5151+
5152+
mMapCanvas->refresh();
51035153
}
51045154

5105-
void QgisApp::localHistogramStretch()
5155+
QgsContrastEnhancement* QgisApp::rasterContrastEnhancement( QgsRasterLayer* rlayer, int band,
5156+
bool visibleAreaOnly ) const
51065157
{
5107-
QgsMapLayer * layer = mMapLegend->currentLayer();
5108-
5109-
if ( !layer )
5158+
if ( !rlayer || band == -1 )
51105159
{
5111-
QMessageBox::information( this,
5112-
tr( "No Layer Selected" ),
5113-
tr( "To perform a local histogram stretch, you need to have a raster layer selected." ) );
5114-
return;
5160+
return 0;
51155161
}
51165162

5117-
QgsRasterLayer* rlayer = qobject_cast<QgsRasterLayer *>( layer );
5118-
if ( !rlayer )
5163+
QgsRasterDataProvider* provider = rlayer->dataProvider();
5164+
if ( !provider )
51195165
{
5120-
QMessageBox::information( this,
5121-
tr( "No Raster Layer Selected" ),
5122-
tr( "To perform a local histogram stretch, you need to have a raster layer selected." ) );
5123-
return;
5166+
return 0;
51245167
}
5125-
if ( rlayer->drawingStyle() == QgsRasterLayer::SingleBandGray ||
5126-
rlayer->drawingStyle() == QgsRasterLayer::MultiBandSingleBandGray ||
5127-
rlayer->drawingStyle() == QgsRasterLayer::MultiBandColor
5128-
)
5168+
5169+
QgsContrastEnhancement* e = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )(
5170+
provider->dataType( band ) ) );
5171+
double minValue = 0;
5172+
double maxValue = 0;
5173+
5174+
if ( visibleAreaOnly )
51295175
{
5130-
rlayer->setContrastEnhancementAlgorithm( "StretchToMinimumMaximum" );
5131-
rlayer->setMinimumMaximumUsingLastExtent();
5132-
rlayer->setCacheImage( NULL );
5133-
//refreshLayerSymbology( rlayer->getLayerID() );
5134-
mMapCanvas->refresh();
5135-
return;
5176+
double minMax[2];
5177+
rlayer->computeMinimumMaximumFromLastExtent( band, minMax );
5178+
minValue = minMax[0];
5179+
maxValue = minMax[1];
51365180
}
51375181
else
51385182
{
5139-
QMessageBox::information( this,
5140-
tr( "No Valid Raster Layer Selected" ),
5141-
tr( "To perform a local histogram stretch, you need to have a grayscale "
5142-
"or multiband (multiband single layer, singleband grayscale or multiband color) "
5143-
" raster layer selected." ) );
5144-
return;
5183+
QgsRasterBandStats rasterBandStats = rlayer->bandStatistics( band );
5184+
minValue = rasterBandStats.minimumValue;
5185+
maxValue = rasterBandStats.maximumValue;
51455186
}
5187+
5188+
e->setMinimumValue( minValue );
5189+
e->setMaximumValue( maxValue );
5190+
e->setContrastEnhancementAlgorithm( QgsContrastEnhancement::StretchToMinimumMaximum );
5191+
return e;
51465192
}
51475193

5194+
void QgisApp::localHistogramStretch()
5195+
{
5196+
histogramStretch( true );
5197+
}
51485198

51495199
void QgisApp::helpContents()
51505200
{

‎src/app/qgisapp.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class QgsAnnotationItem;
4141
class QgsClipboard;
4242
class QgsComposer;
4343
class QgsComposerView;
44+
class QgsContrastEnhancement;
4445
class QgsGeometry;
4546
class QgsFeature;
4647

@@ -964,6 +965,12 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
964965
void updateCRSStatusBar();
965966
void createDecorations();
966967

968+
/**Do histogram stretch for singleband gray / multiband color rasters*/
969+
void histogramStretch( bool visibleAreaOnly = false );
970+
/**Create raster enhancement object for a raster band*/
971+
QgsContrastEnhancement* rasterContrastEnhancement( QgsRasterLayer* rlayer, int band,
972+
bool visibleAreaOnly = false ) const;
973+
967974
// actions for menus and toolbars -----------------
968975

969976
#ifdef Q_WS_MAC

0 commit comments

Comments
 (0)
Please sign in to comment.