Skip to content

Commit 25f8ec5

Browse files
committedDec 27, 2011
Select resampling type from raster properties. Read and write resampling method to project file
1 parent 4827820 commit 25f8ec5

8 files changed

+152
-32
lines changed
 

‎src/app/qgsrasterlayerproperties.cpp‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include "qgslogger.h"
2424
#include "qgsapplication.h"
2525
#include "qgisapp.h"
26+
#include "qgsbilinearrasterresampler.h"
27+
#include "qgscubicrasterresampler.h"
2628
#include "qgscoordinatetransform.h"
2729
#include "qgsrasterlayerproperties.h"
2830
#include "qgsgenericprojectionselector.h"
@@ -284,6 +286,22 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
284286
}
285287
tableTransparency->horizontalHeader()->setResizeMode( 0, QHeaderView::Stretch );
286288
tableTransparency->horizontalHeader()->setResizeMode( 1, QHeaderView::Stretch );
289+
290+
//resampling
291+
const QgsRasterResampler* resampler = mRasterLayer->resampler();
292+
if ( !resampler )
293+
{
294+
mNearestNeighbourRadioButton->setChecked( true );
295+
}
296+
else if ( resampler->type() == "bilinear" )
297+
{
298+
mBilinearRadioButton->setChecked( true );
299+
}
300+
else if ( resampler->type() == "cubic" )
301+
{
302+
mCubicRadioButton->setChecked( true );
303+
}
304+
287305
} // QgsRasterLayerProperties ctor
288306

289307

@@ -1444,6 +1462,22 @@ void QgsRasterLayerProperties::apply()
14441462
pixmapLegend->setScaledContents( true );
14451463
pixmapLegend->repaint();
14461464

1465+
//resampling
1466+
if ( mNearestNeighbourRadioButton->isChecked() )
1467+
{
1468+
mRasterLayer->setResampler( 0 );
1469+
}
1470+
else if ( mBilinearRadioButton->isChecked() )
1471+
{
1472+
mRasterLayer->setResampler( new QgsBilinearRasterResampler() );
1473+
}
1474+
else if ( mCubicRadioButton->isChecked() )
1475+
{
1476+
mRasterLayer->setResampler( new QgsCubicRasterResampler() );
1477+
}
1478+
1479+
1480+
14471481
//get the thumbnail for the layer
14481482
QPixmap myQPixmap = QPixmap( pixmapThumbnail->width(), pixmapThumbnail->height() );
14491483
mRasterLayer->thumbnailAsPixmap( &myQPixmap );

‎src/core/raster/qgsbilinearrasterresampler.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class QgsBilinearRasterResampler: public QgsRasterResampler
2828
~QgsBilinearRasterResampler();
2929

3030
void resample( const QImage& srcImage, QImage& dstImage );
31+
QString type() const { return "bilinear"; }
3132

3233
private:
3334
QRgb resampleColorValue( double u, double v, QRgb col1, QRgb col2, QRgb col3, QRgb col4 ) const;

‎src/core/raster/qgscubicrasterresampler.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class QgsCubicRasterResampler: public QgsRasterResampler
2626
QgsCubicRasterResampler();
2727
~QgsCubicRasterResampler();
2828
void resample( const QImage& srcImage, QImage& dstImage );
29+
QString type() const { return "cubic"; }
2930

3031
private:
3132
static void xDerivativeMatrix( int nCols, int nRows, double* matrix, const int* colorMatrix );

‎src/core/raster/qgsrasterlayer.cpp‎

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ QgsRasterLayer::QgsRasterLayer(
100100
, mWidth( std::numeric_limits<int>::max() )
101101
, mHeight( std::numeric_limits<int>::max() )
102102
, mInvertColor( false )
103+
, mResampler( 0 )
104+
, mRenderer( 0 )
103105
{
104106
QgsDebugMsg( "Entered" );
105107

@@ -185,6 +187,8 @@ QgsRasterLayer::~QgsRasterLayer()
185187
mValid = false;
186188
delete mRasterShader;
187189
delete mDataProvider;
190+
delete mResampler;
191+
delete mRenderer;
188192
}
189193

190194
//////////////////////////////////////////////////////////
@@ -849,9 +853,7 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
849853
colorArray[( int )colorIt->value] = colorIt->color;
850854
}
851855

852-
//QgsBilinearRasterResampler resampler;
853-
QgsCubicRasterResampler resampler;
854-
QgsPalettedRasterRenderer renderer( mDataProvider, bNumber, colorArray, itemList.size(), 0 /*&resampler*/ );
856+
QgsPalettedRasterRenderer renderer( mDataProvider, bNumber, colorArray, itemList.size(), mResampler );
855857
renderer.setOpacity( mTransparencyLevel / 255.0 );
856858
renderer.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
857859
#if 0
@@ -943,9 +945,7 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
943945
int red = bandNumber( mRedBandName );
944946
int green = bandNumber( mGreenBandName );
945947
int blue = bandNumber( mBlueBandName );
946-
//QgsBilinearRasterResampler resampler;
947-
QgsCubicRasterResampler resampler;
948-
QgsMultiBandColorRenderer r( mDataProvider, red, green, blue, &resampler );
948+
QgsMultiBandColorRenderer r( mDataProvider, red, green, blue, mResampler );
949949
r.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
950950
#if 0
951951
drawMultiBandColor( theQPainter, theRasterViewPort,
@@ -2854,6 +2854,18 @@ void QgsRasterLayer::setTransparentBandName( QString const & theBandName )
28542854
mTransparencyBandName = validateBandName( theBandName );
28552855
}
28562856

2857+
void QgsRasterLayer::setResampler( QgsRasterResampler* resampler )
2858+
{
2859+
delete mResampler;
2860+
mResampler = resampler;
2861+
}
2862+
2863+
void QgsRasterLayer::setRenderer( QgsRasterRenderer* renderer )
2864+
{
2865+
delete mRenderer;
2866+
mRenderer = renderer;
2867+
}
2868+
28572869
void QgsRasterLayer::showProgress( int theValue )
28582870
{
28592871
emit progressUpdate( theValue );
@@ -2989,6 +3001,27 @@ bool QgsRasterLayer::readSymbology( const QDomNode& layer_node, QString& errorMe
29893001
{
29903002
Q_UNUSED( errorMessage );
29913003
QDomNode mnl = layer_node.namedItem( "rasterproperties" );
3004+
3005+
//resampler
3006+
QDomElement resamplerElem = mnl.firstChildElement( "resampler" );
3007+
if ( !resamplerElem.isNull() )
3008+
{
3009+
delete mResampler;
3010+
QString rText = resamplerElem.text();
3011+
if ( rText == "bilinear" )
3012+
{
3013+
mResampler = new QgsBilinearRasterResampler();
3014+
}
3015+
else if ( rText == "cubic" )
3016+
{
3017+
mResampler = new QgsCubicRasterResampler();
3018+
}
3019+
else //nearest neighbour
3020+
{
3021+
mResampler = 0;
3022+
}
3023+
}
3024+
29923025
QDomNode snode = mnl.namedItem( "mDrawingStyle" );
29933026
QDomElement myElement = snode.toElement();
29943027
setDrawingStyle( myElement.text() );
@@ -3306,6 +3339,13 @@ bool QgsRasterLayer::writeSymbology( QDomNode & layer_node, QDomDocument & docum
33063339
QDomElement rasterPropertiesElement = document.createElement( "rasterproperties" );
33073340
layer_node.appendChild( rasterPropertiesElement );
33083341

3342+
// resampler
3343+
QString resamplerName = mResampler ? mResampler->type() : "nearest neighbour";
3344+
QDomElement resamplerElem = document.createElement( "resampler" );
3345+
QDomText resamplerText = document.createTextNode( resamplerName );
3346+
resamplerElem.appendChild( resamplerText );
3347+
rasterPropertiesElement.appendChild( resamplerElem );
3348+
33093349
QStringList sl = subLayers();
33103350
QStringList sls = mDataProvider->subLayerStyles();
33113351

‎src/core/raster/qgsrasterlayer.h‎

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ class QgsMapToPixel;
5050
class QgsRectangle;
5151
class QgsRasterBandStats;
5252
class QgsRasterPyramid;
53+
class QgsRasterRenderer;
54+
class QgsRasterResampler;
5355
class QImage;
5456
class QPixmap;
5557
class QSlider;
@@ -391,13 +393,21 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer
391393
/** \brief Mutator for mUserDefinedRGBMinimumMaximum */
392394
void setUserDefinedRGBMinimumMaximum( bool theBool ) { mUserDefinedRGBMinimumMaximum = theBool; }
393395

396+
/** Set raster resampler. Uses nearest neighbour resampling per default. Takes ownership of the resampler object*/
397+
void setResampler( QgsRasterResampler* resampler );
398+
const QgsRasterResampler* resampler() const { return mResampler; }
399+
400+
/**Set raster renderer. Takes ownership of the renderer object*/
401+
void setRenderer( QgsRasterRenderer* renderer );
402+
const QgsRasterRenderer* renderer() const { return mRenderer; }
403+
394404
/** \brief Accessor to find out how many standard deviations are being plotted */
395405
double standardDeviations() const { return mStandardDeviations; }
396406

397407
/** \brief Accessor for transparent band name mapping */
398408
QString transparentBandName() const { return mTransparencyBandName; }
399409

400-
/** \brief [ data provider interface ] Does this layer use a provider for setting/retrieving data?
410+
/** \brief [ data provider interface ] Does this layer use a provider for setting/retrieving data?
401411
* @deprecated in 2.0
402412
*/
403413
Q_DECL_DEPRECATED bool usesProvider();
@@ -548,12 +558,12 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer
548558
/** \brief Get an 100x100 pixmap of the color palette. If the layer has no palette a white pixmap will be returned */
549559
QPixmap paletteAsPixmap( int theBandNumber = 1 );
550560

551-
/** \brief [ data provider interface ] Which provider is being used for this Raster Layer?
561+
/** \brief [ data provider interface ] Which provider is being used for this Raster Layer?
552562
* @note added in 2.0
553563
*/
554564
QString providerType() const;
555565

556-
/** \brief [ data provider interface ] Which provider is being used for this Raster Layer?
566+
/** \brief [ data provider interface ] Which provider is being used for this Raster Layer?
557567
* @deprecated use providerType()
558568
*/
559569
Q_DECL_DEPRECATED QString providerKey() const { return providerType(); }
@@ -926,6 +936,9 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer
926936
QStringList mStyles;
927937
QString mFormat;
928938
QString mCrs;
939+
940+
QgsRasterResampler* mResampler;
941+
QgsRasterRenderer* mRenderer;
929942
};
930943

931944
/*#include <QColor>

‎src/core/raster/qgsrasterrenderer.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ void QgsRasterRenderer::startRasterRead( int bandNumber, QgsRasterViewPort* view
6363
pInfo.nCols = viewPort->drawableAreaXDim * oversampling;
6464
pInfo.nRows = viewPort->drawableAreaYDim * oversampling;
6565
int totalMemoryUsage = pInfo.nCols * pInfo.nRows * mProvider->dataTypeSize( bandNumber );
66-
int parts = totalMemoryUsage / /*100000000*/ 100000 + 1;
66+
int parts = totalMemoryUsage / 100000000 + 1;
6767
pInfo.nPartsPerDimension = sqrt( parts );
6868
pInfo.nColsPerPart = pInfo.nCols / pInfo.nPartsPerDimension;
6969
pInfo.nRowsPerPart = pInfo.nRows / pInfo.nPartsPerDimension;

‎src/core/raster/qgsrasterresampler.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@
1818
#ifndef QGSRASTERRESAMPLER_H
1919
#define QGSRASTERRESAMPLER_H
2020

21+
#include <QString>
22+
2123
class QImage;
2224

2325
/**Interface for resampling rasters (e.g. to have a smoother appearance)*/
2426
class QgsRasterResampler
2527
{
2628
public:
2729
virtual void resample( const QImage& srcImage, QImage& dstImage ) = 0;
30+
virtual QString type() const = 0;
2831
};
2932

3033
#endif // QGSRASTERRESAMPLER_H

‎src/ui/qgsrasterlayerpropertiesbase.ui‎

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>755</width>
10-
<height>667</height>
9+
<width>691</width>
10+
<height>591</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
@@ -44,11 +44,8 @@
4444
<attribute name="title">
4545
<string>Style</string>
4646
</attribute>
47-
<layout class="QGridLayout">
48-
<property name="margin">
49-
<number>0</number>
50-
</property>
51-
<item row="0" column="0" colspan="2">
47+
<layout class="QGridLayout" name="gridLayout_3">
48+
<item row="0" column="1" colspan="3">
5249
<widget class="QGroupBox" name="groupBox_3">
5350
<property name="title">
5451
<string>Render as</string>
@@ -110,7 +107,7 @@
110107
</layout>
111108
</widget>
112109
</item>
113-
<item row="1" column="0" colspan="2">
110+
<item row="1" column="0" colspan="4">
114111
<widget class="QStackedWidget" name="stackedWidget">
115112
<property name="sizePolicy">
116113
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
@@ -131,15 +128,15 @@
131128
<property name="title">
132129
<string>RGB mode band selection and scaling</string>
133130
</property>
134-
<layout class="QGridLayout" name="gridLayout_3">
131+
<layout class="QGridLayout" name="gridLayout_8">
135132
<item row="0" column="0">
136133
<widget class="QLabel" name="lblRed">
137134
<property name="text">
138135
<string>Red band</string>
139136
</property>
140137
</widget>
141138
</item>
142-
<item row="0" column="1" colspan="4">
139+
<item row="0" column="1" colspan="2">
143140
<widget class="QComboBox" name="cboRed">
144141
<property name="sizePolicy">
145142
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
@@ -168,7 +165,7 @@
168165
</property>
169166
</widget>
170167
</item>
171-
<item row="1" column="1" colspan="4">
168+
<item row="1" column="1" colspan="2">
172169
<widget class="QComboBox" name="cboGreen">
173170
<property name="sizePolicy">
174171
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
@@ -197,7 +194,7 @@
197194
</property>
198195
</widget>
199196
</item>
200-
<item row="2" column="1" colspan="4">
197+
<item row="2" column="1" colspan="2">
201198
<widget class="QComboBox" name="cboBlue">
202199
<property name="sizePolicy">
203200
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
@@ -548,6 +545,13 @@
548545
</item>
549546
</layout>
550547
</item>
548+
<item row="9" column="0">
549+
<widget class="QLabel" name="lblMinMaxEstimateWarning">
550+
<property name="text">
551+
<string>Note</string>
552+
</property>
553+
</widget>
554+
</item>
551555
</layout>
552556
</widget>
553557
</item>
@@ -739,21 +743,44 @@
739743
</widget>
740744
</widget>
741745
</item>
742-
<item row="2" column="0" colspan="2">
743-
<widget class="QLabel" name="lblMinMaxEstimateWarning">
744-
<property name="text">
745-
<string>Note</string>
746-
</property>
747-
</widget>
748-
</item>
749-
<item row="4" column="0" colspan="2">
746+
<item row="2" column="0" rowspan="2" colspan="4">
750747
<widget class="Line" name="line">
751748
<property name="orientation">
752749
<enum>Qt::Horizontal</enum>
753750
</property>
754751
</widget>
755752
</item>
756-
<item row="5" column="0">
753+
<item row="4" column="1">
754+
<widget class="QGroupBox" name="mResamplingGroupBox">
755+
<property name="title">
756+
<string>Resampling</string>
757+
</property>
758+
<layout class="QGridLayout" name="gridLayout_7">
759+
<item row="0" column="0">
760+
<widget class="QRadioButton" name="mNearestNeighbourRadioButton">
761+
<property name="text">
762+
<string>Nearest neighbour</string>
763+
</property>
764+
</widget>
765+
</item>
766+
<item row="1" column="0">
767+
<widget class="QRadioButton" name="mBilinearRadioButton">
768+
<property name="text">
769+
<string>Bilinear</string>
770+
</property>
771+
</widget>
772+
</item>
773+
<item row="2" column="0">
774+
<widget class="QRadioButton" name="mCubicRadioButton">
775+
<property name="text">
776+
<string>Cubic</string>
777+
</property>
778+
</widget>
779+
</item>
780+
</layout>
781+
</widget>
782+
</item>
783+
<item row="4" column="2">
757784
<widget class="QGroupBox" name="groupBox_2">
758785
<property name="title">
759786
<string>Load min / max values from band</string>
@@ -841,7 +868,7 @@
841868
</layout>
842869
</widget>
843870
</item>
844-
<item row="5" column="1">
871+
<item row="4" column="3">
845872
<widget class="QGroupBox" name="groupBox_8">
846873
<property name="title">
847874
<string>Contrast enhancement</string>
@@ -1806,6 +1833,7 @@ p, li { white-space: pre-wrap; }
18061833
&lt;tr&gt;
18071834
&lt;td style=&quot;border: none;&quot;&gt;
18081835
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
1836+
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
18091837
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;/p&gt;
18101838
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;&quot;&gt;&lt;/p&gt;
18111839
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;&quot;&gt;&lt;/p&gt;

0 commit comments

Comments
 (0)
Please sign in to comment.