@@ -963,6 +963,8 @@ void QgisApp::createActions()
963
963
// Raster toolbar items
964
964
connect ( mActionLocalHistogramStretch , SIGNAL ( triggered () ), this , SLOT ( localHistogramStretch () ) );
965
965
connect ( mActionFullHistogramStretch , SIGNAL ( triggered () ), this , SLOT ( fullHistogramStretch () ) );
966
+ connect ( mActionLocalCumulativeCutStretch , SIGNAL ( triggered () ), this , SLOT ( localCumulativeCutStretch () ) );
967
+ connect ( mActionFullCumulativeCutStretch , SIGNAL ( triggered () ), this , SLOT ( fullCumulativeCutStretch () ) );
966
968
967
969
// Help Menu Items
968
970
@@ -5461,142 +5463,53 @@ void QgisApp::options()
5461
5463
5462
5464
void QgisApp::fullHistogramStretch ()
5463
5465
{
5464
- histogramStretch ( false );
5466
+ histogramStretch ( false , QgsRasterLayer::ContrastEnhancementMinMax );
5465
5467
}
5466
5468
5467
- void QgisApp::histogramStretch ( bool visibleAreaOnly )
5469
+ void QgisApp::localHistogramStretch ( )
5468
5470
{
5469
- QgsMapLayer * layer = mMapLegend ->currentLayer ();
5471
+ histogramStretch ( true , QgsRasterLayer::ContrastEnhancementMinMax );
5472
+ }
5470
5473
5471
- if ( !layer )
5474
+ void QgisApp::fullCumulativeCutStretch ()
5475
+ {
5476
+ histogramStretch ( false , QgsRasterLayer::ContrastEnhancementCumulativeCut );
5477
+ }
5478
+
5479
+ void QgisApp::localCumulativeCutStretch ()
5480
+ {
5481
+ histogramStretch ( true , QgsRasterLayer::ContrastEnhancementCumulativeCut );
5482
+ }
5483
+
5484
+ void QgisApp::histogramStretch ( bool visibleAreaOnly, QgsRasterLayer::ContrastEnhancementLimits theLimits )
5485
+ {
5486
+ QgsMapLayer * myLayer = mMapLegend ->currentLayer ();
5487
+
5488
+ if ( !myLayer )
5472
5489
{
5473
5490
QMessageBox::information ( this ,
5474
5491
tr ( " No Layer Selected" ),
5475
5492
tr ( " To perform a full histogram stretch, you need to have a raster layer selected." ) );
5476
5493
return ;
5477
5494
}
5478
5495
5479
- QgsRasterLayer* rlayer = qobject_cast<QgsRasterLayer *>( layer );
5480
- if ( !rlayer )
5496
+ QgsRasterLayer* myRasterLayer = qobject_cast<QgsRasterLayer *>( myLayer );
5497
+ if ( !myRasterLayer )
5481
5498
{
5482
5499
QMessageBox::information ( this ,
5483
5500
tr ( " No Raster Layer Selected" ),
5484
5501
tr ( " To perform a full histogram stretch, you need to have a raster layer selected." ) );
5485
5502
return ;
5486
5503
}
5487
5504
5488
- QgsRasterDataProvider* provider = rlayer->dataProvider ();
5489
- if ( !provider )
5490
- {
5491
- return ;
5492
- }
5493
-
5494
- // get renderer
5495
- QgsRasterRenderer* renderer = rlayer->renderer ();
5496
- if ( !renderer )
5497
- {
5498
- return ;
5499
- }
5500
-
5501
- // singleband gray <-> multiband color
5502
- if ( renderer->type () == " singlebandgray" )
5503
- {
5504
- QgsSingleBandGrayRenderer* grayRenderer = static_cast <QgsSingleBandGrayRenderer*>( renderer );
5505
- if ( !grayRenderer )
5506
- {
5507
- return ;
5508
- }
5509
-
5510
- // create new contrast enhancements
5511
- int grayBand = grayRenderer->grayBand ();
5512
- if ( grayBand == -1 )
5513
- {
5514
- return ;
5515
- }
5516
-
5517
- QgsContrastEnhancement* e = rasterContrastEnhancement ( rlayer, grayBand, visibleAreaOnly );
5518
- if ( !e )
5519
- {
5520
- return ;
5521
- }
5522
- grayRenderer->setContrastEnhancement ( e );
5523
- }
5524
- else if ( renderer->type () == " multibandcolor" )
5525
- {
5526
- QgsMultiBandColorRenderer* colorRenderer = static_cast <QgsMultiBandColorRenderer*>( renderer );
5527
- if ( !colorRenderer )
5528
- {
5529
- return ;
5530
- }
5505
+ QgsRectangle myRectangle;
5506
+ if ( visibleAreaOnly ) myRectangle = mMapCanvas ->mapRenderer ()->outputExtentToLayerExtent ( myRasterLayer, mMapCanvas ->extent () );
5531
5507
5532
- QgsContrastEnhancement* redEnhancement = rasterContrastEnhancement ( rlayer, colorRenderer->redBand (), visibleAreaOnly );
5533
- if ( redEnhancement )
5534
- {
5535
- colorRenderer->setRedContrastEnhancement ( redEnhancement );
5536
- }
5537
- QgsContrastEnhancement* greenEnhancement = rasterContrastEnhancement ( rlayer, colorRenderer->greenBand (), visibleAreaOnly );
5538
- if ( greenEnhancement )
5539
- {
5540
- colorRenderer->setGreenContrastEnhancement ( greenEnhancement );
5541
- }
5542
- QgsContrastEnhancement* blueEnhancement = rasterContrastEnhancement ( rlayer, colorRenderer->blueBand (), visibleAreaOnly );
5543
- if ( blueEnhancement )
5544
- {
5545
- colorRenderer->setBlueContrastEnhancement ( blueEnhancement );
5546
- }
5547
- }
5548
- else
5549
- {
5550
- return ;
5551
- }
5508
+ myRasterLayer->setContrastEnhancementAlgorithm ( QgsContrastEnhancement::StretchToMinimumMaximum, theLimits, myRectangle );
5552
5509
5553
5510
mMapCanvas ->refresh ();
5554
5511
}
5555
5512
5556
- QgsContrastEnhancement* QgisApp::rasterContrastEnhancement ( QgsRasterLayer* rlayer, int band,
5557
- bool visibleAreaOnly ) const
5558
- {
5559
- if ( !rlayer || band == -1 )
5560
- {
5561
- return 0 ;
5562
- }
5563
-
5564
- QgsRasterDataProvider* provider = rlayer->dataProvider ();
5565
- if ( !provider )
5566
- {
5567
- return 0 ;
5568
- }
5569
-
5570
- QgsContrastEnhancement* e = new QgsContrastEnhancement (( QgsContrastEnhancement::QgsRasterDataType )(
5571
- provider->dataType ( band ) ) );
5572
- double minValue = 0 ;
5573
- double maxValue = 0 ;
5574
-
5575
- if ( visibleAreaOnly )
5576
- {
5577
- double minMax[2 ];
5578
- rlayer->computeMinimumMaximumFromLastExtent ( band, minMax );
5579
- minValue = minMax[0 ];
5580
- maxValue = minMax[1 ];
5581
- }
5582
- else
5583
- {
5584
- QgsRasterBandStats rasterBandStats = rlayer->dataProvider ()->bandStatistics ( band );
5585
- minValue = rasterBandStats.minimumValue ;
5586
- maxValue = rasterBandStats.maximumValue ;
5587
- }
5588
-
5589
- e->setMinimumValue ( minValue );
5590
- e->setMaximumValue ( maxValue );
5591
- e->setContrastEnhancementAlgorithm ( QgsContrastEnhancement::StretchToMinimumMaximum );
5592
- return e;
5593
- }
5594
-
5595
- void QgisApp::localHistogramStretch ()
5596
- {
5597
- histogramStretch ( true );
5598
- }
5599
-
5600
5513
void QgisApp::helpContents ()
5601
5514
{
5602
5515
openURL ( " index.html" );
0 commit comments