From f503890c2b2ba73f4f94971c1845ead941143262 Mon Sep 17 00:00:00 2001 From: Suleyman TURKMEN Date: Tue, 17 Sep 2024 09:34:38 +0300 Subject: [PATCH] Merge pull request #26152 from sturkmen72:m_buf_supported Documentation update for imagecodecs #26152 ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [ ] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake --- .../imgcodecs/include/opencv2/imgcodecs.hpp | 49 ++-- modules/imgcodecs/src/bitstrm.cpp | 49 +--- modules/imgcodecs/src/bitstrm.hpp | 51 +--- modules/imgcodecs/src/grfmt_base.hpp | 269 +++++++++++++----- modules/imgcodecs/src/grfmt_pfm.cpp | 18 +- modules/imgcodecs/src/grfmt_sunras.cpp | 66 ++--- modules/imgcodecs/test/test_avif.cpp | 1 + 7 files changed, 254 insertions(+), 249 deletions(-) diff --git a/modules/imgcodecs/include/opencv2/imgcodecs.hpp b/modules/imgcodecs/include/opencv2/imgcodecs.hpp index 77f091d55a..9063aafe2c 100644 --- a/modules/imgcodecs/include/opencv2/imgcodecs.hpp +++ b/modules/imgcodecs/include/opencv2/imgcodecs.hpp @@ -222,9 +222,9 @@ enum ImwriteHDRCompressionFlags { @anchor imread -The function imread loads an image from the specified file and returns it. If the image cannot be -read (because of missing file, improper permissions, unsupported or invalid format), the function -returns an empty matrix ( Mat::data==NULL ). +The `imread` function loads an image from the specified file and returns OpenCV matrix. If the image cannot be +read (because of a missing file, improper permissions, or unsupported/invalid format), the function +returns an empty matrix. Currently, the following file formats are supported: @@ -234,7 +234,7 @@ Currently, the following file formats are supported: - Portable Network Graphics - \*.png (see the *Note* section) - WebP - \*.webp (see the *Note* section) - AVIF - \*.avif (see the *Note* section) -- Portable image format - \*.pbm, \*.pgm, \*.ppm \*.pxm, \*.pnm (always supported) +- Portable image format - \*.pbm, \*.pgm, \*.ppm, \*.pxm, \*.pnm (always supported) - PFM files - \*.pfm (see the *Note* section) - Sun rasters - \*.sr, \*.ras (always supported) - TIFF files - \*.tiff, \*.tif (see the *Note* section) @@ -243,32 +243,31 @@ Currently, the following file formats are supported: - Raster and Vector geospatial data supported by GDAL (see the *Note* section) @note -- The function determines the type of an image by the content, not by the file extension. +- The function determines the type of an image by its content, not by the file extension. - In the case of color images, the decoded images will have the channels stored in **B G R** order. - When using IMREAD_GRAYSCALE, the codec's internal grayscale conversion will be used, if available. - Results may differ to the output of cvtColor() -- On Microsoft Windows\* OS and MacOSX\*, the codecs shipped with an OpenCV image (libjpeg, - libpng, libtiff, and libjasper) are used by default. So, OpenCV can always read JPEGs, PNGs, - and TIFFs. On MacOSX, there is also an option to use native MacOSX image readers. But beware - that currently these native image loaders give images with different pixel values because of - the color management embedded into MacOSX. -- On Linux\*, BSD flavors and other Unix-like open-source operating systems, OpenCV looks for - codecs supplied with an OS image. Install the relevant packages (do not forget the development - files, for example, "libjpeg-dev", in Debian\* and Ubuntu\*) to get the codec support or turn + Results may differ from the output of cvtColor(). +- On Microsoft Windows\* and Mac OS\*, the codecs shipped with OpenCV (libjpeg, libpng, libtiff, + and libjasper) are used by default. So, OpenCV can always read JPEGs, PNGs, and TIFFs. On Mac OS, + there is also an option to use native Mac OS image readers. However, beware that currently these + native image loaders give images with different pixel values because of the color management embedded + into Mac OS. +- On Linux\*, BSD flavors, and other Unix-like open-source operating systems, OpenCV looks for + codecs supplied with the OS. Ensure the relevant packages are installed (including development + files, such as "libjpeg-dev" in Debian\* and Ubuntu\*) to get codec support, or turn on the OPENCV_BUILD_3RDPARTY_LIBS flag in CMake. -- In the case you set *WITH_GDAL* flag to true in CMake and @ref IMREAD_LOAD_GDAL to load the image, - then the [GDAL](http://www.gdal.org) driver will be used in order to decode the image, supporting - the following formats: [Raster](http://www.gdal.org/formats_list.html), - [Vector](http://www.gdal.org/ogr_formats.html). -- If EXIF information is embedded in the image file, the EXIF orientation will be taken into account - and thus the image will be rotated accordingly except if the flags @ref IMREAD_IGNORE_ORIENTATION +- If the *WITH_GDAL* flag is set to true in CMake and @ref IMREAD_LOAD_GDAL is used to load the image, + the [GDAL](http://www.gdal.org) driver will be used to decode the image, supporting + [Raster](http://www.gdal.org/formats_list.html) and [Vector](http://www.gdal.org/ogr_formats.html) formats. +- If EXIF information is embedded in the image file, the EXIF orientation will be taken into account, + and thus the image will be rotated accordingly unless the flags @ref IMREAD_IGNORE_ORIENTATION or @ref IMREAD_UNCHANGED are passed. -- Use the IMREAD_UNCHANGED flag to keep the floating point values from PFM image. -- By default number of pixels must be less than 2^30. Limit can be set using system - variable OPENCV_IO_MAX_IMAGE_PIXELS +- Use the IMREAD_UNCHANGED flag to preserve the floating-point values from PFM images. +- By default, the number of pixels must be less than 2^30. This limit can be changed by setting + the environment variable `OPENCV_IO_MAX_IMAGE_PIXELS`. See @ref tutorial_env_reference. -@param filename Name of file to be loaded. -@param flags Flag that can take values of cv::ImreadModes +@param filename Name of the file to be loaded. +@param flags Flag that can take values of `cv::ImreadModes`. */ CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR_BGR ); diff --git a/modules/imgcodecs/src/bitstrm.cpp b/modules/imgcodecs/src/bitstrm.cpp index a8f91aa4dd..bb92d8a73b 100644 --- a/modules/imgcodecs/src/bitstrm.cpp +++ b/modules/imgcodecs/src/bitstrm.cpp @@ -1,44 +1,6 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * The name of the copyright holders may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors "as is" and -// any express or implied warranties, including, but not limited to, the implied -// warranties of merchantability and fitness for a particular purpose are disclaimed. -// In no event shall the Intel Corporation or contributors be liable for any direct, -// indirect, incidental, special, exemplary, or consequential damages -// (including, but not limited to, procurement of substitute goods or services; -// loss of use, data, or profits; or business interruption) however caused -// and on any theory of liability, whether in contract, strict liability, -// or tort (including negligence or otherwise) arising in any way out of -// the use of this software, even if advised of the possibility of such damage. -// -//M*/ +// 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 "precomp.hpp" #include "bitstrm.hpp" @@ -49,11 +11,6 @@ namespace cv const int BS_DEF_BLOCK_SIZE = 1<<15; -bool bsIsBigEndian( void ) -{ - return (((const int*)"\0\x1\x2\x3\x4\x5\x6\x7")[0] & 255) != 0; -} - ///////////////////////// RBaseStream //////////////////////////// bool RBaseStream::isOpened() diff --git a/modules/imgcodecs/src/bitstrm.hpp b/modules/imgcodecs/src/bitstrm.hpp index ebffb91f10..68982175f0 100644 --- a/modules/imgcodecs/src/bitstrm.hpp +++ b/modules/imgcodecs/src/bitstrm.hpp @@ -1,44 +1,6 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * The name of the copyright holders may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors "as is" and -// any express or implied warranties, including, but not limited to, the implied -// warranties of merchantability and fitness for a particular purpose are disclaimed. -// In no event shall the Intel Corporation or contributors be liable for any direct, -// indirect, incidental, special, exemplary, or consequential damages -// (including, but not limited to, procurement of substitute goods or services; -// loss of use, data, or profits; or business interruption) however caused -// and on any theory of liability, whether in contract, strict liability, -// or tort (including negligence or otherwise) arising in any way out of -// the use of this software, even if advised of the possibility of such damage. -// -//M*/ +// 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 #ifndef _BITSTRM_H_ #define _BITSTRM_H_ @@ -183,13 +145,6 @@ public: bool putDWord( int val ); }; -inline unsigned BSWAP(unsigned v) -{ - return (v<<24)|((v&0xff00)<<8)|((v>>8)&0xff00)|((unsigned)v>>24); -} - -bool bsIsBigEndian( void ); - } #endif/*_BITSTRM_H_*/ diff --git a/modules/imgcodecs/src/grfmt_base.hpp b/modules/imgcodecs/src/grfmt_base.hpp index 9ae23b24df..f6b5ba1b27 100644 --- a/modules/imgcodecs/src/grfmt_base.hpp +++ b/modules/imgcodecs/src/grfmt_base.hpp @@ -1,44 +1,6 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * The name of the copyright holders may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors "as is" and -// any express or implied warranties, including, but not limited to, the implied -// warranties of merchantability and fitness for a particular purpose are disclaimed. -// In no event shall the Intel Corporation or contributors be liable for any direct, -// indirect, incidental, special, exemplary, or consequential damages -// (including, but not limited to, procurement of substitute goods or services; -// loss of use, data, or profits; or business interruption) however caused -// and on any theory of liability, whether in contract, strict liability, -// or tort (including negligence or otherwise) arising in any way out of -// the use of this software, even if advised of the possibility of such damage. -// -//M*/ +// 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 #ifndef _GRFMT_BASE_H_ #define _GRFMT_BASE_H_ @@ -55,75 +17,228 @@ class BaseImageEncoder; typedef Ptr ImageEncoder; typedef Ptr ImageDecoder; -///////////////////////////////// base class for decoders //////////////////////// -class BaseImageDecoder -{ +/** + * @brief Base class for image decoders. + * + * The BaseImageDecoder class provides an abstract interface for decoding various image formats. + * It defines common functionality like setting the image source, reading image headers, + * and handling EXIF metadata. Derived classes must implement methods for reading image headers + * and image data to handle format-specific decoding logic. + */ + +class BaseImageDecoder { public: + /** + * @brief Constructor for BaseImageDecoder. + * Initializes the object and sets default values for member variables. + */ BaseImageDecoder(); + + /** + * @brief Virtual destructor for BaseImageDecoder. + * Ensures proper cleanup of derived classes when deleted via a pointer to BaseImageDecoder. + */ virtual ~BaseImageDecoder() {} + /** + * @brief Get the width of the image. + * @return The width of the image (in pixels). + */ int width() const { return m_width; } + + /** + * @brief Get the height of the image. + * @return The height of the image (in pixels). + */ int height() const { return m_height; } + + /** + * @brief Get the number of frames in the image or animation. + * @return The number of frames in the image. + */ size_t getFrameCount() const { return m_frame_count; } + + /** + * @brief Get the type of the image (e.g., color format, depth). + * @return The type of the image. + */ virtual int type() const { return m_type; } + /** + * @brief Fetch a specific EXIF tag from the image's metadata. + * @param tag The EXIF tag to retrieve. + * @return The EXIF entry corresponding to the tag. + */ ExifEntry_t getExifTag(const ExifTagName tag) const; - virtual bool setSource( const String& filename ); - virtual bool setSource( const Mat& buf ); - virtual int setScale( const int& scale_denom ); - virtual bool readHeader() = 0; - virtual bool readData( Mat& img ) = 0; + /** + * @brief Set the image source from a file. + * @param filename The name of the file to load the image from. + * @return true if the source was successfully set, false otherwise. + */ + virtual bool setSource(const String& filename); + + /** + * @brief Set the image source from a memory buffer. + * @param buf The buffer containing the image data. + * @return true if the source was successfully set, false otherwise. + */ + virtual bool setSource(const Mat& buf); + + /** + * @brief Set the scale factor for the image. + * @param scale_denom The denominator of the scale factor (image is scaled down by 1/scale_denom). + * @return The scale factor that was set. + */ + virtual int setScale(const int& scale_denom); + + /** + * @brief Read the image header to extract basic properties (width, height, type). + * This is a pure virtual function that must be implemented by derived classes. + * @return true if the header was successfully read, false otherwise. + */ + virtual bool readHeader() = 0; + + /** + * @brief Read the image data into a Mat object. + * This is a pure virtual function that must be implemented by derived classes. + * @param img The Mat object where the image data will be stored. + * @return true if the data was successfully read, false otherwise. + */ + virtual bool readData(Mat& img) = 0; + + /** + * @brief Set whether to decode the image in RGB order instead of the default BGR. + * @param useRGB If true, the image will be decoded in RGB order. + */ virtual void setRGB(bool useRGB); - /// Called after readData to advance to the next page, if any. + /** + * @brief Advance to the next page or frame of the image, if applicable. + * The default implementation does nothing and returns false. + * @return true if there is another page/frame, false otherwise. + */ virtual bool nextPage() { return false; } + /** + * @brief Get the length of the format signature used to identify the image format. + * @return The length of the signature. + */ virtual size_t signatureLength() const; - virtual bool checkSignature( const String& signature ) const; + + /** + * @brief Check if the provided signature matches the expected format signature. + * @param signature The signature to check. + * @return true if the signature matches, false otherwise. + */ + virtual bool checkSignature(const String& signature) const; + + /** + * @brief Create and return a new instance of the derived image decoder. + * @return A new ImageDecoder object. + */ virtual ImageDecoder newDecoder() const; protected: - int m_width; // width of the image ( filled by readHeader ) - int m_height; // height of the image ( filled by readHeader ) - int m_type; - int m_scale_denom; - String m_filename; - String m_signature; - Mat m_buf; - bool m_buf_supported; - bool m_use_rgb; // flag of decode image as RGB order instead of BGR. - ExifReader m_exif; - size_t m_frame_count; + int m_width; ///< Width of the image (set by readHeader). + int m_height; ///< Height of the image (set by readHeader). + int m_type; ///< Image type (e.g., color depth, channel order). + int m_scale_denom; ///< Scale factor denominator for resizing the image. + String m_filename; ///< Name of the file that is being decoded. + String m_signature; ///< Signature for identifying the image format. + Mat m_buf; ///< Buffer holding the image data when loaded from memory. + bool m_buf_supported; ///< Flag indicating whether buffer-based loading is supported. + bool m_use_rgb; ///< Flag indicating whether to decode the image in RGB order. + ExifReader m_exif; ///< Object for reading EXIF metadata from the image. + size_t m_frame_count; ///< Number of frames in the image (for animations and multi-page images). }; -///////////////////////////// base class for encoders //////////////////////////// -class BaseImageEncoder -{ +/** + * @brief Base class for image encoders. + * + * The BaseImageEncoder class provides an abstract interface for encoding images in various formats. + * It defines common functionality like setting the destination (file or memory buffer), checking if + * the format supports a specific image depth, and writing image data. Derived classes must implement + * methods like writing the image data to handle format-specific encoding logic. + */ +class BaseImageEncoder { public: + /** + * @brief Constructor for BaseImageEncoder. + * Initializes the object and sets default values for member variables. + */ BaseImageEncoder(); - virtual ~BaseImageEncoder() {} - virtual bool isFormatSupported( int depth ) const; - virtual bool setDestination( const String& filename ); - virtual bool setDestination( std::vector& buf ); - virtual bool write( const Mat& img, const std::vector& params ) = 0; + /** + * @brief Virtual destructor for BaseImageEncoder. + * Ensures proper cleanup of derived classes when deleted via a pointer to BaseImageEncoder. + */ + virtual ~BaseImageEncoder() {} + + /** + * @brief Checks if the image format supports a specific image depth. + * @param depth The depth (bit depth) of the image. + * @return true if the format supports the specified depth, false otherwise. + */ + virtual bool isFormatSupported(int depth) const; + + /** + * @brief Set the destination for encoding as a file. + * @param filename The name of the file to which the image will be written. + * @return true if the destination was successfully set, false otherwise. + */ + virtual bool setDestination(const String& filename); + + /** + * @brief Set the destination for encoding as a memory buffer. + * @param buf A reference to the buffer where the encoded image data will be stored. + * @return true if the destination was successfully set, false otherwise. + */ + virtual bool setDestination(std::vector& buf); + + /** + * @brief Encode and write the image data. + * This is a pure virtual function that must be implemented by derived classes. + * @param img The Mat object containing the image data to be encoded. + * @param params A vector of parameters controlling the encoding process (e.g., compression level). + * @return true if the image was successfully written, false otherwise. + */ + virtual bool write(const Mat& img, const std::vector& params) = 0; + + /** + * @brief Encode and write multiple images (e.g., for animated formats). + * By default, this method returns false, indicating that the format does not support multi-image encoding. + * @param img_vec A vector of Mat objects containing the images to be encoded. + * @param params A vector of parameters controlling the encoding process. + * @return true if multiple images were successfully written, false otherwise. + */ virtual bool writemulti(const std::vector& img_vec, const std::vector& params); + /** + * @brief Get a description of the image encoder (e.g., the format it supports). + * @return A string describing the encoder. + */ virtual String getDescription() const; + + /** + * @brief Create and return a new instance of the derived image encoder. + * @return A new ImageEncoder object. + */ virtual ImageEncoder newEncoder() const; + /** + * @brief Throw an exception based on the last error encountered during encoding. + * This method can be used to propagate error conditions back to the caller. + */ virtual void throwOnEror() const; protected: - String m_description; - - String m_filename; - std::vector* m_buf; - bool m_buf_supported; - - String m_last_error; + String m_description; ///< Description of the encoder (e.g., format name, capabilities). + String m_filename; ///< Destination file name for encoded data. + std::vector* m_buf; ///< Pointer to the buffer for encoded data if using memory-based destination. + bool m_buf_supported; ///< Flag indicating whether buffer-based encoding is supported. + String m_last_error; ///< Stores the last error message encountered during encoding. }; } diff --git a/modules/imgcodecs/src/grfmt_pfm.cpp b/modules/imgcodecs/src/grfmt_pfm.cpp index 61cab06714..baa0108081 100644 --- a/modules/imgcodecs/src/grfmt_pfm.cpp +++ b/modules/imgcodecs/src/grfmt_pfm.cpp @@ -81,20 +81,17 @@ PFMDecoder::~PFMDecoder() PFMDecoder::PFMDecoder() : m_scale_factor(0), m_swap_byte_order(false) { - m_strm.close(); + m_buf_supported = true; } bool PFMDecoder::readHeader() { - if (m_buf.empty()) { - if (!m_strm.open(m_filename)) { - return false; - } - } else { - if (!m_strm.open(m_buf)) { - return false; - } - } + if (!m_buf.empty()) + m_strm.open(m_buf); + else + m_strm.open(m_filename); + + if( !m_strm.isOpened()) return false; if (m_strm.getByte() != 'P') { CV_Error(Error::StsError, "Unexpected file type (expected P)"); @@ -177,6 +174,7 @@ void PFMDecoder::close() PFMEncoder::PFMEncoder() { m_description = "Portable image format - float (*.pfm)"; + m_buf_supported = true; } PFMEncoder::~PFMEncoder() diff --git a/modules/imgcodecs/src/grfmt_sunras.cpp b/modules/imgcodecs/src/grfmt_sunras.cpp index 852e735477..f2878d1760 100644 --- a/modules/imgcodecs/src/grfmt_sunras.cpp +++ b/modules/imgcodecs/src/grfmt_sunras.cpp @@ -1,44 +1,6 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * The name of the copyright holders may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors "as is" and -// any express or implied warranties, including, but not limited to, the implied -// warranties of merchantability and fitness for a particular purpose are disclaimed. -// In no event shall the Intel Corporation or contributors be liable for any direct, -// indirect, incidental, special, exemplary, or consequential damages -// (including, but not limited to, procurement of substitute goods or services; -// loss of use, data, or profits; or business interruption) however caused -// and on any theory of liability, whether in contract, strict liability, -// or tort (including negligence or otherwise) arising in any way out of -// the use of this software, even if advised of the possibility of such damage. -// -//M*/ +// 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 "precomp.hpp" #include "grfmt_sunras.hpp" @@ -60,6 +22,7 @@ SunRasterDecoder::SunRasterDecoder() m_encoding = RAS_STANDARD; m_maptype = RMT_NONE; m_maplength = 0; + m_buf_supported = true; } @@ -82,7 +45,12 @@ bool SunRasterDecoder::readHeader() { bool result = false; - if( !m_strm.open( m_filename )) return false; + if (!m_buf.empty()) + m_strm.open(m_buf); + else + m_strm.open(m_filename); + + if( !m_strm.isOpened()) return false; try { @@ -389,6 +357,7 @@ bad_decoding_end: SunRasterEncoder::SunRasterEncoder() { m_description = "Sun raster files (*.sr;*.ras)"; + m_buf_supported = true; } @@ -408,7 +377,18 @@ bool SunRasterEncoder::write( const Mat& img, const std::vector& ) int fileStep = (width*channels + 1) & -2; WMByteStream strm; - if( strm.open(m_filename) ) + if (m_buf) { + if (!strm.open(*m_buf)) { + return false; + } + else { + m_buf->reserve(height * fileStep + 32); + } + } + else + strm.open(m_filename); + + if( strm.isOpened() ) { CHECK_WRITE(strm.putBytes( fmtSignSunRas, (int)strlen(fmtSignSunRas) )); CHECK_WRITE(strm.putDWord( width )); diff --git a/modules/imgcodecs/test/test_avif.cpp b/modules/imgcodecs/test/test_avif.cpp index 68678599b2..0d8a718756 100644 --- a/modules/imgcodecs/test/test_avif.cpp +++ b/modules/imgcodecs/test/test_avif.cpp @@ -336,6 +336,7 @@ TEST_P(Imgcodecs_Avif_Animation_WriteDecodeSuite, encode_decode) { file.seekg(0, std::ios::beg); std::vector buf(size); EXPECT_TRUE(file.read(reinterpret_cast(buf.data()), size)); + file.close(); EXPECT_EQ(0, remove(output.c_str())); std::vector anim; ASSERT_TRUE(cv::imdecodemulti(buf, imread_mode_, anim));