diff --git a/modules/imgcodecs/src/loadsave.cpp b/modules/imgcodecs/src/loadsave.cpp index 7a610af614b3b03c83a49b9fe82f0b7192fa1bcd..6dd412fe6fc4e268324bcf6f8819c8006f889651 100644 --- a/modules/imgcodecs/src/loadsave.cpp +++ b/modules/imgcodecs/src/loadsave.cpp @@ -748,24 +748,28 @@ bool imwrite( const String& filename, InputArray _img, static void* imdecode_( const Mat& buf, int flags, int hdrtype, Mat* mat=0 ) { - CV_Assert(!buf.empty() && buf.isContinuous()); + CV_Assert(!buf.empty()); + CV_Assert(buf.isContinuous()); + CV_Assert(buf.checkVector(1, CV_8U) > 0); + Mat buf_row = buf.reshape(1, 1); // decoders expects single row, avoid issues with vector columns + IplImage* image = 0; CvMat *matrix = 0; Mat temp, *data = &temp; String filename; - ImageDecoder decoder = findDecoder(buf); + ImageDecoder decoder = findDecoder(buf_row); if( !decoder ) return 0; - if( !decoder->setSource(buf) ) + if( !decoder->setSource(buf_row) ) { filename = tempfile(); FILE* f = fopen( filename.c_str(), "wb" ); if( !f ) return 0; - size_t bufSize = buf.cols*buf.rows*buf.elemSize(); - if( fwrite( buf.ptr(), 1, bufSize, f ) != bufSize ) + size_t bufSize = buf_row.total()*buf.elemSize(); + if (fwrite(buf_row.ptr(), 1, bufSize, f) != bufSize) { fclose( f ); CV_Error( CV_StsError, "failed to write image data to temporary file" );