Skip to content

Commit 255cd61

Browse files
author
Andrey Kamaev
committed
Improve error reporting of JPEG image encoder
OpenCV issue opencv#2604 After this patch applied an attempt to encode empty images produces exception saying "Raw image encoder error: Empty JPEG image (DNL not supported)"
1 parent 8521ac5 commit 255cd61

File tree

5 files changed

+37
-1
lines changed

5 files changed

+37
-1
lines changed

modules/highgui/src/grfmt_base.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,15 @@ ImageEncoder BaseImageEncoder::newEncoder() const
123123
return ImageEncoder();
124124
}
125125

126+
void BaseImageEncoder::throwOnEror() const
127+
{
128+
if(!m_last_error.empty())
129+
{
130+
std::string msg = "Raw image encoder error: " + m_last_error;
131+
CV_Error( CV_BadImageSize, msg.c_str() );
132+
}
133+
}
134+
126135
}
127136

128137
/* End of file. */

modules/highgui/src/grfmt_base.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,16 @@ class BaseImageEncoder
100100
virtual string getDescription() const;
101101
virtual ImageEncoder newEncoder() const;
102102

103+
virtual void throwOnEror() const;
104+
103105
protected:
104106
string m_description;
105107

106108
string m_filename;
107109
vector<uchar>* m_buf;
108110
bool m_buf_supported;
111+
112+
string m_last_error;
109113
};
110114

111115
}

modules/highgui/src/grfmt_jpeg.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,8 +537,10 @@ ImageEncoder JpegEncoder::newEncoder() const
537537
return new JpegEncoder;
538538
}
539539

540-
bool JpegEncoder::write( const Mat& img, const vector<int>& params )
540+
bool JpegEncoder::write( const Mat& img, const vector<int>& params )
541541
{
542+
m_last_error.clear();
543+
542544
struct fileWrapper
543545
{
544546
FILE* f;
@@ -633,6 +635,14 @@ bool JpegEncoder::write( const Mat& img, const vector<int>& params )
633635
}
634636

635637
_exit_:
638+
639+
if(!result)
640+
{
641+
char jmsg_buf[JMSG_LENGTH_MAX];
642+
jerr.pub.format_message((j_common_ptr)&cinfo, jmsg_buf);
643+
m_last_error = jmsg_buf;
644+
}
645+
636646
jpeg_destroy_compress( &cinfo );
637647

638648
return result;

modules/highgui/src/loadsave.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,15 +426,19 @@ bool imencode( const string& ext, InputArray _image,
426426
if( encoder->setDestination(buf) )
427427
{
428428
code = encoder->write(image, params);
429+
encoder->throwOnEror();
429430
CV_Assert( code );
430431
}
431432
else
432433
{
433434
string filename = tempfile();
434435
code = encoder->setDestination(filename);
435436
CV_Assert( code );
437+
436438
code = encoder->write(image, params);
439+
encoder->throwOnEror();
437440
CV_Assert( code );
441+
438442
FILE* f = fopen( filename.c_str(), "rb" );
439443
CV_Assert(f != 0);
440444
fseek( f, 0, SEEK_END );

modules/highgui/test/test_grfmt.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,3 +282,12 @@ TEST(Highgui_ImreadVSCvtColor, regression)
282282
}
283283
#endif
284284

285+
#ifdef HAVE_JPEG
286+
TEST(Highgui_Jpeg, encode_empty)
287+
{
288+
cv::Mat img;
289+
std::vector<uchar> jpegImg;
290+
291+
ASSERT_THROW(cv::imencode(".jpg", img, jpegImg), cv::Exception);
292+
}
293+
#endif

0 commit comments

Comments
 (0)