138
138
#include " qgsmessageviewer.h"
139
139
#include " qgsmimedatautils.h"
140
140
#include " qgsmessagelog.h"
141
+ #include " qgsmultibandcolorrenderer.h"
141
142
#include " qgsnewvectorlayerdialog.h"
142
143
#include " qgsoptions.h"
143
144
#include " qgspastetransformations.h"
157
158
#include " qgsrastercalcdialog.h"
158
159
#include " qgsrasterlayer.h"
159
160
#include " qgsrasterlayerproperties.h"
161
+ #include " qgsrasterrenderer.h"
160
162
#include " qgsrectangle.h"
161
163
#include " qgsrenderer.h"
162
164
#include " qgsscalecombobox.h"
163
165
#include " qgsshortcutsmanager.h"
166
+ #include " qgssinglebandgrayrenderer.h"
164
167
#include " qgssnappingdialog.h"
165
168
#include " qgssponsors.h"
166
169
#include " qgstextannotationitem.h"
@@ -5056,6 +5059,11 @@ void QgisApp::options()
5056
5059
}
5057
5060
5058
5061
void QgisApp::fullHistogramStretch ()
5062
+ {
5063
+ histogramStretch ( false );
5064
+ }
5065
+
5066
+ void QgisApp::histogramStretch ( bool visibleAreaOnly )
5059
5067
{
5060
5068
QgsMapLayer * layer = mMapLegend ->currentLayer ();
5061
5069
@@ -5075,76 +5083,118 @@ void QgisApp::fullHistogramStretch()
5075
5083
tr ( " To perform a full histogram stretch, you need to have a raster layer selected." ) );
5076
5084
return ;
5077
5085
}
5078
- if ( rlayer->providerType () == " wms" )
5086
+
5087
+ QgsRasterDataProvider* provider = rlayer->dataProvider ();
5088
+ if ( !provider )
5079
5089
{
5080
5090
return ;
5081
5091
}
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 )
5086
5096
{
5087
- rlayer->setContrastEnhancementAlgorithm ( " StretchToMinimumMaximum" );
5088
- rlayer->setMinimumMaximumUsingDataset ();
5089
- rlayer->setCacheImage ( NULL );
5090
- // refreshLayerSymbology( rlayer->getLayerID() );
5091
- mMapCanvas ->refresh ();
5092
5097
return ;
5093
5098
}
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
+ }
5094
5147
else
5095
5148
{
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." ) );
5101
5149
return ;
5102
5150
}
5151
+
5152
+ mMapCanvas ->refresh ();
5103
5153
}
5104
5154
5105
- void QgisApp::localHistogramStretch ()
5155
+ QgsContrastEnhancement* QgisApp::rasterContrastEnhancement ( QgsRasterLayer* rlayer, int band,
5156
+ bool visibleAreaOnly ) const
5106
5157
{
5107
- QgsMapLayer * layer = mMapLegend ->currentLayer ();
5108
-
5109
- if ( !layer )
5158
+ if ( !rlayer || band == -1 )
5110
5159
{
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 ;
5115
5161
}
5116
5162
5117
- QgsRasterLayer* rlayer = qobject_cast<QgsRasterLayer *>( layer );
5118
- if ( !rlayer )
5163
+ QgsRasterDataProvider* provider = rlayer-> dataProvider ( );
5164
+ if ( !provider )
5119
5165
{
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 ;
5124
5167
}
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 )
5129
5175
{
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 ];
5136
5180
}
5137
5181
else
5138
5182
{
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 ;
5145
5186
}
5187
+
5188
+ e->setMinimumValue ( minValue );
5189
+ e->setMaximumValue ( maxValue );
5190
+ e->setContrastEnhancementAlgorithm ( QgsContrastEnhancement::StretchToMinimumMaximum );
5191
+ return e;
5146
5192
}
5147
5193
5194
+ void QgisApp::localHistogramStretch ()
5195
+ {
5196
+ histogramStretch ( true );
5197
+ }
5148
5198
5149
5199
void QgisApp::helpContents ()
5150
5200
{
0 commit comments