using namespace cv;
using namespace std;
+static
+bool mats_equal(const Mat& lhs, const Mat& rhs)
+{
+ if (lhs.channels() != rhs.channels() ||
+ lhs.depth() != rhs.depth() ||
+ lhs.size().height != rhs.size().height ||
+ lhs.size().width != rhs.size().width)
+ {
+ return false;
+ }
+
+ Mat diff = (lhs != rhs);
+ const Scalar s = sum(diff);
+ for (int i = 0; i < s.channels; ++i)
+ {
+ if (s[i] != 0)
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static
+bool imread_compare(const string& filepath, int flags = IMREAD_COLOR)
+{
+ vector<Mat> pages;
+ if (!imreadmulti(filepath, pages, flags) ||
+ pages.empty())
+ {
+ return false;
+ }
+
+ const Mat single = imread(filepath, flags);
+ return mats_equal(single, pages[0]);
+}
+
+TEST(Imgcodecs_imread, regression)
+{
+ const char* const filenames[] =
+ {
+ "color_palette_alpha.png",
+ "multipage.tif",
+ "rle.hdr",
+ "ordinary.bmp",
+ "rle8.bmp",
+ "test_1_c1.jpg"
+ };
+
+ const string folder = string(cvtest::TS::ptr()->get_data_path()) + "/readwrite/";
+
+ for (size_t i = 0; i < sizeof(filenames) / sizeof(filenames[0]); ++i)
+ {
+ ASSERT_TRUE(imread_compare(folder + string(filenames[i]), IMREAD_UNCHANGED));
+ ASSERT_TRUE(imread_compare(folder + string(filenames[i]), IMREAD_GRAYSCALE));
+ ASSERT_TRUE(imread_compare(folder + string(filenames[i]), IMREAD_COLOR));
+ ASSERT_TRUE(imread_compare(folder + string(filenames[i]), IMREAD_ANYDEPTH));
+ ASSERT_TRUE(imread_compare(folder + string(filenames[i]), IMREAD_ANYCOLOR));
+ ASSERT_TRUE(imread_compare(folder + string(filenames[i]), IMREAD_LOAD_GDAL));
+ }
+}
class CV_GrfmtWriteBigImageTest : public cvtest::BaseTest
{
CV_GrfmtReadTifTiledWithNotFullTiles test; test.safe_run();
}
+class CV_GrfmtReadTifMultiPage : public cvtest::BaseTest
+{
+private:
+ void compare(int flags)
+ {
+ const string folder = string(cvtest::TS::ptr()->get_data_path()) + "/readwrite/";
+ const int page_count = 6;
+
+ vector<Mat> pages;
+ bool res = imreadmulti(folder + "multipage.tif", pages, flags);
+ ASSERT_TRUE(res == true);
+ ASSERT_TRUE(pages.size() == page_count);
+
+ for (int i = 0; i < page_count; i++)
+ {
+ char buffer[256];
+ sprintf(buffer, "%smultipage_p%d.tif", folder.c_str(), i + 1);
+ const string filepath(buffer);
+ const Mat page = imread(filepath, flags);
+ ASSERT_TRUE(mats_equal(page, pages[i]));
+ }
+ }
+
+public:
+ void run(int)
+ {
+ compare(IMREAD_UNCHANGED);
+ compare(IMREAD_GRAYSCALE);
+ compare(IMREAD_COLOR);
+ compare(IMREAD_ANYDEPTH);
+ compare(IMREAD_ANYCOLOR);
+ compare(IMREAD_LOAD_GDAL);
+ }
+};
+
+TEST(Imgcodecs_Tiff, decode_multipage)
+{
+ CV_GrfmtReadTifMultiPage test; test.safe_run();
+}
+
#endif
#ifdef HAVE_WEBP