diff --git a/modules/imgcodecs/include/opencv2/imgcodecs.hpp b/modules/imgcodecs/include/opencv2/imgcodecs.hpp index e21db8e1e5..678861bfeb 100644 --- a/modules/imgcodecs/include/opencv2/imgcodecs.hpp +++ b/modules/imgcodecs/include/opencv2/imgcodecs.hpp @@ -62,12 +62,18 @@ namespace cv //! Imread flags enum ImreadModes { - IMREAD_UNCHANGED = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). - IMREAD_GRAYSCALE = 0, //!< If set, always convert image to the single channel grayscale image. - IMREAD_COLOR = 1, //!< If set, always convert image to the 3 channel BGR color image. - IMREAD_ANYDEPTH = 2, //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit. - IMREAD_ANYCOLOR = 4, //!< If set, the image is read in any possible color format. - IMREAD_LOAD_GDAL = 8 //!< If set, use the gdal driver for loading the image. + IMREAD_UNCHANGED = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). + IMREAD_GRAYSCALE = 0, //!< If set, always convert image to the single channel grayscale image. + IMREAD_COLOR = 1, //!< If set, always convert image to the 3 channel BGR color image. + IMREAD_ANYDEPTH = 2, //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit. + IMREAD_ANYCOLOR = 4, //!< If set, the image is read in any possible color format. + IMREAD_LOAD_GDAL = 8, //!< If set, use the gdal driver for loading the image. + IMREAD_GRAYSCALE_REDUCED_2 = 16, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2. + IMREAD_COLOR_REDUCED_2 = 17, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2. + IMREAD_GRAYSCALE_REDUCED_4 = 32, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4. + IMREAD_COLOR_REDUCED_4 = 33, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4. + IMREAD_GRAYSCALE_REDUCED_8 = 64, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8. + IMREAD_COLOR_REDUCED_8 = 65 //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8. }; //! Imwrite flags @@ -133,14 +139,6 @@ returns an empty matrix ( Mat::data==NULL ). Currently, the following file forma */ CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR ); -/** @brief Loads and resizes down an image from a file. -@anchor imread_reduced -@param filename Name of file to be loaded. -@param flags Flag that can take values of @ref cv::ImreadModes -@param scale_denom - */ -CV_EXPORTS_W Mat imread_reduced( const String& filename, int flags = IMREAD_COLOR, int scale_denom=1 ); - /** @brief Loads a multi-page image from a file. (see imread for details.) @param filename Name of file to be loaded. diff --git a/modules/imgcodecs/src/loadsave.cpp b/modules/imgcodecs/src/loadsave.cpp index a7bf46f427..336777aeeb 100644 --- a/modules/imgcodecs/src/loadsave.cpp +++ b/modules/imgcodecs/src/loadsave.cpp @@ -238,7 +238,7 @@ enum { LOAD_CVMAT=0, LOAD_IMAGE=1, LOAD_MAT=2 }; * */ static void* -imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_denom=1 ) +imread_( const String& filename, int flags, int hdrtype, Mat* mat=0 ) { IplImage* image = 0; CvMat *matrix = 0; @@ -252,7 +252,7 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_d decoder = GdalDecoder().newDecoder(); }else{ #endif - decoder = findDecoder(filename); + decoder = findDecoder( filename ); #ifdef HAVE_GDAL } #endif @@ -262,11 +262,22 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_d return 0; } + int scale_denom = 1; + if( flags > IMREAD_LOAD_GDAL ) + { + if( flags & IMREAD_GRAYSCALE_REDUCED_2 ) + scale_denom = 2; + else if( flags & IMREAD_GRAYSCALE_REDUCED_4 ) + scale_denom = 4; + else if( flags & IMREAD_GRAYSCALE_REDUCED_8 ) + scale_denom = 8; + } + /// set the scale_denom in the driver decoder->setScale( scale_denom ); /// set the filename in the driver - decoder->setSource(filename); + decoder->setSource( filename ); // read the header to make sure it succeeds if( !decoder->readHeader() ) @@ -296,7 +307,7 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_d if( hdrtype == LOAD_CVMAT ) { matrix = cvCreateMat( size.height, size.width, type ); - temp = cvarrToMat(matrix); + temp = cvarrToMat( matrix ); } else { @@ -307,7 +318,7 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_d else { image = cvCreateImage( size, cvIplDepth(type), CV_MAT_CN(type) ); - temp = cvarrToMat(image); + temp = cvarrToMat( image ); } // read the image data @@ -320,10 +331,9 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_d return 0; } - int testdecoder = decoder->setScale( scale_denom ); // if decoder is JpegDecoder then testdecoder will be 1 - if( (scale_denom > 1 ) & ( testdecoder > 1 ) ) + if( decoder->setScale( scale_denom ) > 1 ) // if decoder is JpegDecoder then decoder->setScale always returns 1 { - resize(*mat,*mat,Size(size.width/scale_denom,size.height/scale_denom)); + resize( *mat, *mat, Size( size.width / scale_denom, size.height / scale_denom ) ); } return hdrtype == LOAD_CVMAT ? (void*)matrix : @@ -421,27 +431,6 @@ Mat imread( const String& filename, int flags ) return img; } -/** - * Read an image and resize it - * - * This function merely calls the actual implementation above and returns itself. - * - * @param[in] filename File to load - * @param[in] flags Flags you wish to set. - * @param[in] scale_denom Scale value -*/ -Mat imread_reduced( const String& filename, int flags, int scale_denom ) -{ - /// create the basic container - Mat img; - - /// load the data - imread_( filename, flags, LOAD_MAT, &img, scale_denom ); - - /// return a reference to the data - return img; -} - /** * Read a multi-page image *