37 int nCols = srcImage.width();
38 int nRows = srcImage.height();
42 int* redMatrix =
new int[ nCols * nRows ];
43 int* greenMatrix =
new int[ nCols * nRows ];
44 int* blueMatrix =
new int[ nCols * nRows ];
45 int* alphaMatrix =
new int[ nCols * nRows ];
47 for (
int i = 0; i < nRows; ++i )
49 for (
int j = 0; j < nCols; ++j )
51 px = srcImage.pixel( j, i );
52 redMatrix[pos] = qRed( px );
53 greenMatrix[pos] = qGreen( px );
54 blueMatrix[pos] = qBlue( px );
55 alphaMatrix[pos] = qAlpha( px );
61 double* xDerivativeMatrixRed =
new double[ nCols * nRows ];
63 double* xDerivativeMatrixGreen =
new double[ nCols * nRows ];
65 double* xDerivativeMatrixBlue =
new double[ nCols * nRows ];
67 double* xDerivativeMatrixAlpha =
new double[ nCols * nRows ];
71 double* yDerivativeMatrixRed =
new double[ nCols * nRows ];
73 double* yDerivativeMatrixGreen =
new double[ nCols * nRows ];
75 double* yDerivativeMatrixBlue =
new double[ nCols * nRows ];
77 double* yDerivativeMatrixAlpha =
new double[ nCols * nRows ];
81 double nSrcPerDstX = ( double ) srcImage.width() / ( double ) dstImage.width();
82 double nSrcPerDstY = ( double ) srcImage.height() / ( double ) dstImage.height();
84 double currentSrcRow = nSrcPerDstY / 2.0 - 0.5;
88 int lastSrcColInt = -1;
89 int lastSrcRowInt = -1;
93 double bp0u, bp1u, bp2u, bp3u, bp0v, bp1v, bp2v, bp3v;
96 for (
int i = 0; i < dstImage.height(); ++i )
98 currentSrcRowInt = floor( currentSrcRow );
99 v = currentSrcRow - currentSrcRowInt;
101 currentSrcCol = nSrcPerDstX / 2.0 - 0.5;
102 for (
int j = 0; j < dstImage.width(); ++j )
104 currentSrcColInt = floor( currentSrcCol );
105 u = currentSrcCol - currentSrcColInt;
108 if ( currentSrcRowInt < 0 || currentSrcRowInt >= ( srcImage.height() - 1 ) || currentSrcColInt < 0 || currentSrcColInt >= ( srcImage.width() - 1 ) )
112 if ( currentSrcRowInt < 0 && currentSrcColInt < 0 )
114 dstImage.setPixel( j, i, srcImage.pixel( 0, 0 ) );
116 else if ( currentSrcRowInt < 0 && currentSrcColInt >= ( srcImage.width() - 1 ) )
118 dstImage.setPixel( j, i, srcImage.pixel( srcImage.width() - 1, 0 ) );
120 else if ( currentSrcRowInt >= ( srcImage.height() - 1 ) && currentSrcColInt >= ( srcImage.width() - 1 ) )
122 dstImage.setPixel( j, i, srcImage.pixel( srcImage.width() - 1, srcImage.height() - 1 ) );
124 else if ( currentSrcRowInt >= ( srcImage.height() - 1 ) && currentSrcColInt < 0 )
126 dstImage.setPixel( j, i, srcImage.pixel( 0, srcImage.height() - 1 ) );
128 else if ( currentSrcRowInt < 0 )
130 px1 = srcImage.pixel( currentSrcColInt, 0 );
131 px2 = srcImage.pixel( currentSrcColInt + 1, 0 );
132 dstImage.setPixel( j, i,
curveInterpolation( px1, px2, u, xDerivativeMatrixRed[ currentSrcColInt ], xDerivativeMatrixGreen[ currentSrcColInt ],
133 xDerivativeMatrixBlue[ currentSrcColInt ], xDerivativeMatrixAlpha[ currentSrcColInt ], xDerivativeMatrixRed[ currentSrcColInt + 1 ], xDerivativeMatrixGreen[ currentSrcColInt + 1 ],
134 xDerivativeMatrixBlue[ currentSrcColInt + 1 ], xDerivativeMatrixAlpha[ currentSrcColInt + 1 ] ) );
136 else if ( currentSrcRowInt >= ( srcImage.height() - 1 ) )
138 int idx = ( srcImage.height() - 1 ) * srcImage.width() + currentSrcColInt;
139 px1 = srcImage.pixel( currentSrcColInt, srcImage.height() - 1 );
140 px2 = srcImage.pixel( currentSrcColInt + 1, srcImage.height() - 1 );
141 dstImage.setPixel( j, i,
curveInterpolation( px1, px2, u, xDerivativeMatrixRed[ idx ], xDerivativeMatrixGreen[ idx ], xDerivativeMatrixBlue[idx],
142 xDerivativeMatrixAlpha[idx], xDerivativeMatrixRed[ idx + 1 ], xDerivativeMatrixGreen[ idx + 1 ], xDerivativeMatrixBlue[idx + 1],
143 xDerivativeMatrixAlpha[idx + 1] ) );
145 else if ( currentSrcColInt < 0 )
147 int idx1 = currentSrcRowInt * srcImage.width();
148 int idx2 = idx1 + srcImage.width();
149 px1 = srcImage.pixel( 0, currentSrcRowInt );
150 px2 = srcImage.pixel( 0, currentSrcRowInt + 1 );
151 dstImage.setPixel( j, i,
curveInterpolation( px1, px2, v, yDerivativeMatrixRed[ idx1 ], yDerivativeMatrixGreen[ idx1 ], yDerivativeMatrixBlue[ idx1],
152 yDerivativeMatrixAlpha[ idx1], yDerivativeMatrixRed[ idx2 ], yDerivativeMatrixGreen[ idx2 ], yDerivativeMatrixBlue[ idx2],
153 yDerivativeMatrixAlpha[ idx2] ) );
155 else if ( currentSrcColInt >= ( srcImage.width() - 1 ) )
157 int idx1 = currentSrcRowInt * srcImage.width() + srcImage.width() - 1;
158 int idx2 = idx1 + srcImage.width();
159 px1 = srcImage.pixel( srcImage.width() - 1, currentSrcRowInt );
160 px2 = srcImage.pixel( srcImage.width() - 1, currentSrcRowInt + 1 );
161 dstImage.setPixel( j, i,
curveInterpolation( px1, px2, v, yDerivativeMatrixRed[ idx1 ], yDerivativeMatrixGreen[ idx1 ], yDerivativeMatrixBlue[ idx1],
162 yDerivativeMatrixAlpha[ idx1], yDerivativeMatrixRed[ idx2 ], yDerivativeMatrixGreen[ idx2 ], yDerivativeMatrixBlue[ idx2],
163 yDerivativeMatrixAlpha[ idx2] ) );
165 currentSrcCol += nSrcPerDstX;
170 if ( currentSrcColInt != lastSrcColInt || currentSrcRowInt != lastSrcRowInt )
172 calculateControlPoints( nCols, nRows, currentSrcRowInt, currentSrcColInt, redMatrix, greenMatrix, blueMatrix, alphaMatrix,
173 xDerivativeMatrixRed, xDerivativeMatrixGreen, xDerivativeMatrixBlue, xDerivativeMatrixAlpha,
174 yDerivativeMatrixRed, yDerivativeMatrixGreen, yDerivativeMatrixBlue, yDerivativeMatrixAlpha );
185 r = bp0u * bp0v *
cRed00 +
253 dstImage.setPixel( j, i, qRgba( r, g, b, a ) );
254 lastSrcColInt = currentSrcColInt;
255 currentSrcCol += nSrcPerDstX;
257 lastSrcRowInt = currentSrcRowInt;
258 currentSrcRow += nSrcPerDstY;
264 delete[] greenMatrix;
266 delete[] xDerivativeMatrixRed;
267 delete[] xDerivativeMatrixGreen;
268 delete[] xDerivativeMatrixBlue;
269 delete[] yDerivativeMatrixRed;
270 delete[] yDerivativeMatrixGreen;
271 delete[] yDerivativeMatrixBlue;
279 for (
int i = 0; i < nRows; ++i )
281 for (
int j = 0; j < nCols; ++j )
285 val = colorMatrix[index + 1] - colorMatrix[
index];
287 else if ( j == ( nCols - 1 ) )
289 val = colorMatrix[
index] - colorMatrix[ index - 1 ];
293 val = ( colorMatrix[index + 1] - colorMatrix[index - 1] ) / 2.0;
306 for (
int i = 0; i < nRows; ++i )
308 for (
int j = 0; j < nCols; ++j )
312 val = colorMatrix[ index + nCols ] - colorMatrix[
index ];
314 else if ( i == ( nRows - 1 ) )
316 val = colorMatrix[
index ] - colorMatrix[ index - nCols ];
320 val = ( colorMatrix[ index + nCols ] - colorMatrix[ index - nCols ] ) / 2.0;
329 int* alphaMatrix,
double* xDerivativeMatrixRed,
double* xDerivativeMatrixGreen,
double* xDerivativeMatrixBlue,
double* xDerivativeMatrixAlpha,
330 double* yDerivativeMatrixRed,
double* yDerivativeMatrixGreen,
double* yDerivativeMatrixBlue,
double* yDerivativeMatrixAlpha )
333 int idx00 = currentRow * nCols + currentCol;
334 int idx10 = idx00 + 1;
335 int idx01 = idx00 + nCols;
336 int idx11 = idx01 + 1;
378 double d2red,
double d2green,
double d2blue,
double d2alpha )
381 double p0r = qRed( pt1 );
double p1r = p0r + 0.333 * d1red;
double p3r = qRed( pt2 );
double p2r = p3r - 0.333 * d2red;
382 double p0g = qGreen( pt1 );
double p1g = p0g + 0.333 * d1green;
double p3g = qGreen( pt2 );
double p2g = p3g - 0.333 * d2green;
383 double p0b = qBlue( pt1 );
double p1b = p0b + 0.333 * d1blue;
double p3b = qBlue( pt2 );
double p2b = p3b - 0.333 * d2blue;
384 double p0a = qAlpha( pt1 );
double p1a = p0a + 0.333 * d1alpha;
double p3a = qAlpha( pt2 );
double p2a = p3a - 0.333 * d2alpha;
392 int red = bp0 * p0r + bp1 * p1r + bp2 * p2r + bp3 * p3r;
393 int green = bp0 * p0g + bp1 * p1g + bp2 * p2g + bp3 * p3g;
394 int blue = bp0 * p0b + bp1 * p1b + bp2 * p2b + bp3 * p3b;
395 int alpha = bp0 * p0a + bp1 * p1a + bp2 * p2a + bp3 * p3a;
397 return qRgba( red, green, blue, alpha );
412 if ( i >= 0 && i <= n )
429 for (
int i = 2; i <= qAbs((
double )b ); i++ )
453 if ( n == 0 || n == 1 )
456 for ( i = n - 1; i >= 2; i-- )
static double calcBernsteinPoly(int n, int i, double t)
Interface for resampling rasters (e.g.
QRgb curveInterpolation(QRgb pt1, QRgb pt2, double t, double d1red, double d1green, double d1blue, double d1alpha, double d2red, double d2green, double d2blue, double d2alpha)
Use cubic curve interpoation at the borders of the raster.
static int lower(int n, int i)
~QgsCubicRasterResampler()
static void yDerivativeMatrix(int nCols, int nRows, double *matrix, const int *colorMatrix)
static int faculty(int n)
void resample(const QImage &srcImage, QImage &dstImage)
QgsCubicRasterResampler()
QgsRasterResampler * clone() const
static void xDerivativeMatrix(int nCols, int nRows, double *matrix, const int *colorMatrix)
static double power(double a, int b)
void calculateControlPoints(int nCols, int nRows, int currentRow, int currentCol, int *redMatrix, int *greenMatrix, int *blueMatrix, int *alphaMatrix, double *xDerivativeMatrixRed, double *xDerivativeMatrixGreen, double *xDerivativeMatrixBlue, double *xDerivativeMatrixAlpha, double *yDerivativeMatrixRed, double *yDerivativeMatrixGreen, double *yDerivativeMatrixBlue, double *yDerivativeMatrixAlpha)