return ImageEncoder();
}
+void BaseImageEncoder::throwOnEror() const
+{
+ if(!m_last_error.empty())
+ {
+ std::string msg = "Raw image encoder error: " + m_last_error;
+ CV_Error( CV_BadImageSize, msg.c_str() );
+ }
+}
+
}
/* End of file. */
virtual string getDescription() const;
virtual ImageEncoder newEncoder() const;
+ virtual void throwOnEror() const;
+
protected:
string m_description;
string m_filename;
vector<uchar>* m_buf;
bool m_buf_supported;
+
+ string m_last_error;
};
}
return new JpegEncoder;
}
-bool JpegEncoder::write( const Mat& img, const vector<int>& params )
+bool JpegEncoder::write( const Mat& img, const vector<int>& params )
{
+ m_last_error.clear();
+
struct fileWrapper
{
FILE* f;
}
_exit_:
+
+ if(!result)
+ {
+ char jmsg_buf[JMSG_LENGTH_MAX];
+ jerr.pub.format_message((j_common_ptr)&cinfo, jmsg_buf);
+ m_last_error = jmsg_buf;
+ }
+
jpeg_destroy_compress( &cinfo );
return result;
if( encoder->setDestination(buf) )
{
code = encoder->write(image, params);
+ encoder->throwOnEror();
CV_Assert( code );
}
else
string filename = tempfile();
code = encoder->setDestination(filename);
CV_Assert( code );
+
code = encoder->write(image, params);
+ encoder->throwOnEror();
CV_Assert( code );
+
FILE* f = fopen( filename.c_str(), "rb" );
CV_Assert(f != 0);
fseek( f, 0, SEEK_END );
}
#endif
+#ifdef HAVE_JPEG
+TEST(Highgui_Jpeg, encode_empty)
+{
+ cv::Mat img;
+ std::vector<uchar> jpegImg;
+
+ ASSERT_THROW(cv::imencode(".jpg", img, jpegImg), cv::Exception);
+}
+#endif