@@ -723,6 +723,7 @@ static bool imwrite_( const String& filename, const std::vector<Mat>& img_vec,
723
723
Mat temp;
724
724
if ( !encoder->isFormatSupported (image.depth ()) )
725
725
{
726
+ CV_LOG_ONCE_WARNING (NULL , " Unsupported depth image for selected encoder is fallbacked to CV_8U." );
726
727
CV_Assert ( encoder->isFormatSupported (CV_8U) );
727
728
image.convertTo ( temp, CV_8U );
728
729
image = temp;
@@ -787,10 +788,12 @@ static bool imwrite_( const String& filename, const std::vector<Mat>& img_vec,
787
788
catch (const cv::Exception& e)
788
789
{
789
790
CV_LOG_ERROR (NULL , " imwrite_('" << filename << " '): can't write data: " << e.what ());
791
+ code = false ;
790
792
}
791
793
catch (...)
792
794
{
793
795
CV_LOG_ERROR (NULL , " imwrite_('" << filename << " '): can't write data: unknown exception" );
796
+ code = false ;
794
797
}
795
798
796
799
return code;
@@ -978,7 +981,7 @@ imdecodemulti_(const Mat& buf, int flags, std::vector<Mat>& mats, int start, int
978
981
979
982
ImageDecoder decoder = findDecoder (buf_row);
980
983
if (!decoder)
981
- return 0 ;
984
+ return false ;
982
985
983
986
// Try to decode image by RGB instead of BGR.
984
987
if (flags & IMREAD_COLOR_RGB && flags != IMREAD_UNCHANGED)
@@ -995,7 +998,7 @@ imdecodemulti_(const Mat& buf, int flags, std::vector<Mat>& mats, int start, int
995
998
filename = tempfile ();
996
999
FILE* f = fopen (filename.c_str (), " wb" );
997
1000
if (!f)
998
- return 0 ;
1001
+ return false ;
999
1002
size_t bufSize = buf_row.total () * buf.elemSize ();
1000
1003
if (fwrite (buf_row.ptr (), 1 , bufSize, f) != bufSize)
1001
1004
{
@@ -1121,27 +1124,44 @@ bool imdecodemulti(InputArray _buf, int flags, CV_OUT std::vector<Mat>& mats, co
1121
1124
}
1122
1125
}
1123
1126
1124
- bool imencode ( const String& ext, InputArray _image ,
1127
+ bool imencode ( const String& ext, InputArray _img ,
1125
1128
std::vector<uchar>& buf, const std::vector<int >& params_ )
1126
1129
{
1127
1130
CV_TRACE_FUNCTION ();
1128
1131
1129
- Mat image = _image.getMat ();
1130
- CV_Assert (!image.empty ());
1131
-
1132
- int channels = image.channels ();
1133
- CV_Assert ( channels == 1 || channels == 3 || channels == 4 );
1134
-
1135
1132
ImageEncoder encoder = findEncoder ( ext );
1136
1133
if ( !encoder )
1137
1134
CV_Error ( Error::StsError, " could not find encoder for the specified extension" );
1138
1135
1139
- if ( !encoder->isFormatSupported (image.depth ()) )
1136
+ std::vector<Mat> img_vec;
1137
+ CV_Assert (!_img.empty ());
1138
+ if (_img.isMatVector () || _img.isUMatVector ())
1139
+ _img.getMatVector (img_vec);
1140
+ else
1141
+ img_vec.push_back (_img.getMat ());
1142
+
1143
+ CV_Assert (!img_vec.empty ());
1144
+ const bool isMultiImg = img_vec.size () > 1 ;
1145
+
1146
+ std::vector<Mat> write_vec;
1147
+ for (size_t page = 0 ; page < img_vec.size (); page++)
1140
1148
{
1141
- CV_Assert ( encoder->isFormatSupported (CV_8U) );
1149
+ Mat image = img_vec[page];
1150
+ CV_Assert (!image.empty ());
1151
+
1152
+ const int channels = image.channels ();
1153
+ CV_Assert ( channels == 1 || channels == 3 || channels == 4 );
1154
+
1142
1155
Mat temp;
1143
- image.convertTo (temp, CV_8U);
1144
- image = temp;
1156
+ if ( !encoder->isFormatSupported (image.depth ()) )
1157
+ {
1158
+ CV_LOG_ONCE_WARNING (NULL , " Unsupported depth image for selected encoder is fallbacked to CV_8U." );
1159
+ CV_Assert ( encoder->isFormatSupported (CV_8U) );
1160
+ image.convertTo ( temp, CV_8U );
1161
+ image = temp;
1162
+ }
1163
+
1164
+ write_vec.push_back (image);
1145
1165
}
1146
1166
1147
1167
#if CV_VERSION_MAJOR < 5 && defined(HAVE_IMGCODEC_HDR)
@@ -1166,23 +1186,37 @@ bool imencode( const String& ext, InputArray _image,
1166
1186
CV_Check (params.size (), (params.size () & 1 ) == 0 , " Encoding 'params' must be key-value pairs" );
1167
1187
CV_CheckLE (params.size (), (size_t )(CV_IO_MAX_IMAGE_PARAMS*2 ), " " );
1168
1188
1169
- bool code;
1170
- if ( encoder->setDestination (buf) )
1171
- {
1172
- code = encoder->write (image, params);
1173
- encoder->throwOnEror ();
1174
- CV_Assert ( code );
1175
- }
1176
- else
1189
+ bool code = false ;
1190
+ String filename;
1191
+ if ( !encoder->setDestination (buf) )
1177
1192
{
1178
- String filename = tempfile ();
1193
+ filename = tempfile ();
1179
1194
code = encoder->setDestination (filename);
1180
1195
CV_Assert ( code );
1196
+ }
1197
+
1198
+ try {
1199
+ if (!isMultiImg)
1200
+ code = encoder->write (write_vec[0 ], params);
1201
+ else
1202
+ code = encoder->writemulti (write_vec, params);
1181
1203
1182
- code = encoder->write (image, params);
1183
1204
encoder->throwOnEror ();
1184
1205
CV_Assert ( code );
1206
+ }
1207
+ catch (const cv::Exception& e)
1208
+ {
1209
+ CV_LOG_ERROR (NULL , " imencode(): can't encode data: " << e.what ());
1210
+ code = false ;
1211
+ }
1212
+ catch (...)
1213
+ {
1214
+ CV_LOG_ERROR (NULL , " imencode(): can't encode data: unknown exception" );
1215
+ code = false ;
1216
+ }
1185
1217
1218
+ if ( !filename.empty () && code )
1219
+ {
1186
1220
FILE* f = fopen ( filename.c_str (), " rb" );
1187
1221
CV_Assert (f != 0 );
1188
1222
fseek ( f, 0 , SEEK_END );
@@ -1196,6 +1230,12 @@ bool imencode( const String& ext, InputArray _image,
1196
1230
return code;
1197
1231
}
1198
1232
1233
+ bool imencodemulti ( const String& ext, InputArrayOfArrays imgs,
1234
+ std::vector<uchar>& buf, const std::vector<int >& params)
1235
+ {
1236
+ return imencode (ext, imgs, buf, params);
1237
+ }
1238
+
1199
1239
bool haveImageReader ( const String& filename )
1200
1240
{
1201
1241
ImageDecoder decoder = cv::findDecoder (filename);
0 commit comments