139
139
#include " qgsmessageviewer.h"
140
140
#include " qgsmimedatautils.h"
141
141
#include " qgsmessagelog.h"
142
+ #include " qgsmultibandcolorrenderer.h"
142
143
#include " qgsnewvectorlayerdialog.h"
143
144
#include " qgsoptions.h"
144
145
#include " qgspastetransformations.h"
158
159
#include " qgsrastercalcdialog.h"
159
160
#include " qgsrasterlayer.h"
160
161
#include " qgsrasterlayerproperties.h"
162
+ #include " qgsrasterrenderer.h"
161
163
#include " qgsrectangle.h"
162
164
#include " qgsrenderer.h"
163
165
#include " qgsscalecombobox.h"
164
166
#include " qgsshortcutsmanager.h"
167
+ #include " qgssinglebandgrayrenderer.h"
165
168
#include " qgssnappingdialog.h"
166
169
#include " qgssponsors.h"
167
170
#include " qgstextannotationitem.h"
@@ -5097,6 +5100,11 @@ void QgisApp::options()
5097
5100
}
5098
5101
5099
5102
void QgisApp::fullHistogramStretch ()
5103
+ {
5104
+ histogramStretch ( false );
5105
+ }
5106
+
5107
+ void QgisApp::histogramStretch ( bool visibleAreaOnly )
5100
5108
{
5101
5109
QgsMapLayer * layer = mMapLegend ->currentLayer ();
5102
5110
@@ -5116,76 +5124,118 @@ void QgisApp::fullHistogramStretch()
5116
5124
tr ( " To perform a full histogram stretch, you need to have a raster layer selected." ) );
5117
5125
return ;
5118
5126
}
5119
- if ( rlayer->providerType () == " wms" )
5127
+
5128
+ QgsRasterDataProvider* provider = rlayer->dataProvider ();
5129
+ if ( !provider )
5120
5130
{
5121
5131
return ;
5122
5132
}
5123
- if ( rlayer-> drawingStyle () == QgsRasterLayer::SingleBandGray ||
5124
- rlayer-> drawingStyle () == QgsRasterLayer::MultiBandSingleBandGray ||
5125
- rlayer->drawingStyle () == QgsRasterLayer::MultiBandColor
5126
- )
5133
+
5134
+ // get renderer
5135
+ QgsRasterRenderer* renderer = rlayer->renderer ();
5136
+ if ( !renderer )
5127
5137
{
5128
- rlayer->setContrastEnhancementAlgorithm ( " StretchToMinimumMaximum" );
5129
- rlayer->setMinimumMaximumUsingDataset ();
5130
- rlayer->setCacheImage ( NULL );
5131
- // refreshLayerSymbology( rlayer->getLayerID() );
5132
- mMapCanvas ->refresh ();
5133
5138
return ;
5134
5139
}
5140
+
5141
+ // singleband gray <-> multiband color
5142
+ if ( renderer->type () == " singlebandgray" )
5143
+ {
5144
+ QgsSingleBandGrayRenderer* grayRenderer = static_cast <QgsSingleBandGrayRenderer*>( renderer );
5145
+ if ( !grayRenderer )
5146
+ {
5147
+ return ;
5148
+ }
5149
+
5150
+ // create new contrast enhancements
5151
+ int grayBand = grayRenderer->grayBand ();
5152
+ if ( grayBand == -1 )
5153
+ {
5154
+ return ;
5155
+ }
5156
+
5157
+ QgsContrastEnhancement* e = rasterContrastEnhancement ( rlayer, grayBand, visibleAreaOnly );
5158
+ if ( !e )
5159
+ {
5160
+ return ;
5161
+ }
5162
+ grayRenderer->setContrastEnhancement ( e );
5163
+ }
5164
+ else if ( renderer->type () == " multibandcolor" )
5165
+ {
5166
+ QgsMultiBandColorRenderer* colorRenderer = static_cast <QgsMultiBandColorRenderer*>( renderer );
5167
+ if ( !colorRenderer )
5168
+ {
5169
+ return ;
5170
+ }
5171
+
5172
+ QgsContrastEnhancement* redEnhancement = rasterContrastEnhancement ( rlayer, colorRenderer->redBand (), visibleAreaOnly );
5173
+ if ( redEnhancement )
5174
+ {
5175
+ colorRenderer->setRedContrastEnhancement ( redEnhancement );
5176
+ }
5177
+ QgsContrastEnhancement* greenEnhancement = rasterContrastEnhancement ( rlayer, colorRenderer->greenBand (), visibleAreaOnly );
5178
+ if ( greenEnhancement )
5179
+ {
5180
+ colorRenderer->setGreenContrastEnhancement ( greenEnhancement );
5181
+ }
5182
+ QgsContrastEnhancement* blueEnhancement = rasterContrastEnhancement ( rlayer, colorRenderer->blueBand (), visibleAreaOnly );
5183
+ if ( blueEnhancement )
5184
+ {
5185
+ colorRenderer->setBlueContrastEnhancement ( blueEnhancement );
5186
+ }
5187
+ }
5135
5188
else
5136
5189
{
5137
- QMessageBox::information ( this ,
5138
- tr ( " No Valid Raster Layer Selected" ),
5139
- tr ( " To perform a local histogram stretch, you need to have a grayscale "
5140
- " or multiband (multiband single layer, singleband grayscale or multiband color) "
5141
- " raster layer selected." ) );
5142
5190
return ;
5143
5191
}
5192
+
5193
+ mMapCanvas ->refresh ();
5144
5194
}
5145
5195
5146
- void QgisApp::localHistogramStretch ()
5196
+ QgsContrastEnhancement* QgisApp::rasterContrastEnhancement ( QgsRasterLayer* rlayer, int band,
5197
+ bool visibleAreaOnly ) const
5147
5198
{
5148
- QgsMapLayer * layer = mMapLegend ->currentLayer ();
5149
-
5150
- if ( !layer )
5199
+ if ( !rlayer || band == -1 )
5151
5200
{
5152
- QMessageBox::information ( this ,
5153
- tr ( " No Layer Selected" ),
5154
- tr ( " To perform a local histogram stretch, you need to have a raster layer selected." ) );
5155
- return ;
5201
+ return 0 ;
5156
5202
}
5157
5203
5158
- QgsRasterLayer* rlayer = qobject_cast<QgsRasterLayer *>( layer );
5159
- if ( !rlayer )
5204
+ QgsRasterDataProvider* provider = rlayer-> dataProvider ( );
5205
+ if ( !provider )
5160
5206
{
5161
- QMessageBox::information ( this ,
5162
- tr ( " No Raster Layer Selected" ),
5163
- tr ( " To perform a local histogram stretch, you need to have a raster layer selected." ) );
5164
- return ;
5207
+ return 0 ;
5165
5208
}
5166
- if ( rlayer->drawingStyle () == QgsRasterLayer::SingleBandGray ||
5167
- rlayer->drawingStyle () == QgsRasterLayer::MultiBandSingleBandGray ||
5168
- rlayer->drawingStyle () == QgsRasterLayer::MultiBandColor
5169
- )
5209
+
5210
+ QgsContrastEnhancement* e = new QgsContrastEnhancement (( QgsContrastEnhancement::QgsRasterDataType )(
5211
+ provider->dataType ( band ) ) );
5212
+ double minValue = 0 ;
5213
+ double maxValue = 0 ;
5214
+
5215
+ if ( visibleAreaOnly )
5170
5216
{
5171
- rlayer->setContrastEnhancementAlgorithm ( " StretchToMinimumMaximum" );
5172
- rlayer->setMinimumMaximumUsingLastExtent ();
5173
- rlayer->setCacheImage ( NULL );
5174
- // refreshLayerSymbology( rlayer->getLayerID() );
5175
- mMapCanvas ->refresh ();
5176
- return ;
5217
+ double minMax[2 ];
5218
+ rlayer->computeMinimumMaximumFromLastExtent ( band, minMax );
5219
+ minValue = minMax[0 ];
5220
+ maxValue = minMax[1 ];
5177
5221
}
5178
5222
else
5179
5223
{
5180
- QMessageBox::information ( this ,
5181
- tr ( " No Valid Raster Layer Selected" ),
5182
- tr ( " To perform a local histogram stretch, you need to have a grayscale "
5183
- " or multiband (multiband single layer, singleband grayscale or multiband color) "
5184
- " raster layer selected." ) );
5185
- return ;
5224
+ QgsRasterBandStats rasterBandStats = rlayer->bandStatistics ( band );
5225
+ minValue = rasterBandStats.minimumValue ;
5226
+ maxValue = rasterBandStats.maximumValue ;
5186
5227
}
5228
+
5229
+ e->setMinimumValue ( minValue );
5230
+ e->setMaximumValue ( maxValue );
5231
+ e->setContrastEnhancementAlgorithm ( QgsContrastEnhancement::StretchToMinimumMaximum );
5232
+ return e;
5187
5233
}
5188
5234
5235
+ void QgisApp::localHistogramStretch ()
5236
+ {
5237
+ histogramStretch ( true );
5238
+ }
5189
5239
5190
5240
void QgisApp::helpContents ()
5191
5241
{
0 commit comments