// This file is part of OpenCV project. // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html #include "test_precomp.hpp" namespace opencv_test { namespace { #ifdef HAVE_WEBP TEST(Imgcodecs_WebP, encode_decode_lossless_webp) { const string root = cvtest::TS::ptr()->get_data_path(); string filename = root + "../cv/shared/lena.png"; cv::Mat img = cv::imread(filename); ASSERT_FALSE(img.empty()); string output = cv::tempfile(".webp"); EXPECT_NO_THROW(cv::imwrite(output, img)); // lossless cv::Mat img_webp = cv::imread(output); std::vector buf; FILE * wfile = NULL; wfile = fopen(output.c_str(), "rb"); if (wfile != NULL) { fseek(wfile, 0, SEEK_END); size_t wfile_size = ftell(wfile); fseek(wfile, 0, SEEK_SET); buf.resize(wfile_size); size_t data_size = fread(&buf[0], 1, wfile_size, wfile); if(wfile) { fclose(wfile); } if (data_size != wfile_size) { EXPECT_TRUE(false); } } EXPECT_EQ(0, remove(output.c_str())); cv::Mat decode = cv::imdecode(buf, IMREAD_COLOR); ASSERT_FALSE(decode.empty()); EXPECT_TRUE(cvtest::norm(decode, img_webp, NORM_INF) == 0); ASSERT_FALSE(img_webp.empty()); EXPECT_TRUE(cvtest::norm(img, img_webp, NORM_INF) == 0); } TEST(Imgcodecs_WebP, encode_decode_lossy_webp) { const string root = cvtest::TS::ptr()->get_data_path(); std::string input = root + "../cv/shared/lena.png"; cv::Mat img = cv::imread(input); ASSERT_FALSE(img.empty()); for(int q = 100; q>=0; q-=20) { std::vector params; params.push_back(IMWRITE_WEBP_QUALITY); params.push_back(q); string output = cv::tempfile(".webp"); EXPECT_NO_THROW(cv::imwrite(output, img, params)); cv::Mat img_webp = cv::imread(output); EXPECT_EQ(0, remove(output.c_str())); EXPECT_FALSE(img_webp.empty()); EXPECT_EQ(3, img_webp.channels()); EXPECT_EQ(512, img_webp.cols); EXPECT_EQ(512, img_webp.rows); } } TEST(Imgcodecs_WebP, encode_decode_with_alpha_webp) { const string root = cvtest::TS::ptr()->get_data_path(); std::string input = root + "../cv/shared/lena.png"; cv::Mat img = cv::imread(input); ASSERT_FALSE(img.empty()); std::vector imgs; cv::split(img, imgs); imgs.push_back(cv::Mat(imgs[0])); imgs[imgs.size() - 1] = cv::Scalar::all(128); cv::merge(imgs, img); string output = cv::tempfile(".webp"); EXPECT_NO_THROW(cv::imwrite(output, img)); cv::Mat img_webp = cv::imread(output, IMREAD_UNCHANGED); cv::Mat img_webp_bgr = cv::imread(output); // IMREAD_COLOR by default EXPECT_EQ(0, remove(output.c_str())); EXPECT_FALSE(img_webp.empty()); EXPECT_EQ(4, img_webp.channels()); EXPECT_EQ(512, img_webp.cols); EXPECT_EQ(512, img_webp.rows); EXPECT_FALSE(img_webp_bgr.empty()); EXPECT_EQ(3, img_webp_bgr.channels()); EXPECT_EQ(512, img_webp_bgr.cols); EXPECT_EQ(512, img_webp_bgr.rows); } #endif // HAVE_WEBP }} // namespace