#ifndef H_Image #define H_Image #include #include #include /// @brief This class encapsulates the raw data of an image. /// The Image class has a constructor that takes the width, height, and optionally depth of the image, and dynamically allocates a buffer of size width * height * depth to store the image data. The destructor deallocates the buffer to avoid memory leaks. /// The class provides three accessor methods GetWidth(), GetHeight(), and GetDepth() to query the image dimensions. /// The GetPixel() method takes the x, y, and z coordinates of the pixel (in row-major order) and returns the corresponding value from the buffer. /// The SetPixel() method takes the x, y, and z coordinates of the pixel and a value, and sets the corresponding pixel in the buffer to the given value. /// Note that the GetPixel() and SetPixel() methods use the formula z * width * height + y * width + x to compute the index of the pixel in the buffer. This formula assumes row-major order, where the x coordinate varies fastest, followed by the y coordinate, and then the z coordinate. If the image had a different ordering, the formula would need to be adjusted accordingly. class Image { public: /// @brief Initializes the image with the given width, height, and optionally depth. Warning : the values are uninitialized. /// @param width_ Width of the image. /// @param height_ Height of the image. /// @param depth_ Depth of the image. Image(int width_, int height_, int depth_ = 1); /// @brief Frees the allocated memory of the image. ~Image(); /// @brief Loads an image from a file. /// @param filename Path to the image file. Image(std::string const& filename); /// @brief Saves the image to a file. /// Supports the following formats : PNG, BMP, TGA, JPG. The format is determined from the file extension. /// @param filename Path to save the image to. Save(std::string const& filename) const; int GetWidth() const; int GetHeight() const; int GetDepth() const; /// @brief Fills the image with the given value. All channels are set. /// @param value Value to fill the image with. Image & Fill(unsigned char value); /// @brief Fills the image with the given rgb value. /// @param rgb RGB value to fill the image with. Image & Fill(Eigen::Vector3i const& rgb); /// @brief Returns the value of the chosen channel of the given pixel. /// @param i Row index. /// @param j Column index. /// @param c Channel index. /// @return The value of the chosen channel of the given pixel. unsigned char GetPixelValue(int i, int j, int c = 0) const; /// @brief Sets the value of the chosen channel of the given pixel. /// @param i Row index. /// @param j Column index. /// @param c Channel index. /// @param value Value of the chosen channel of the given pixel. void SetPixelValue(int i, int j, int c, unsigned char value); /// @brief Returns a mutable reference to the chosen channel of the given pixel. /// @param i Row index. /// @param j Column index. /// @param c Channel index. /// @return A mutable reference to the value of the chosen channel of the given pixel. unsigned char & PixelValue(int i, int j, int c = 0); /// @brief Returns the given pixel as a 3D-vector containing the RGB values. /// @param i Row index. /// @param j Column index. /// @return Given pixel as a 3D-vector containing the RGB values. Eigen::Vector3i GetPixel(int i, int j) const; /// @brief Returns the given pixel as a 3D-vector containing the RGB values. /// @param pos 2D vector containing the row and column indices. /// @return Given pixel as a 3D-vector containing the RGB values. Eigen::Vector3i GetPixel(Eigen::Vector2i const& pos) const; /// @brief Sets the given pixel to the given RGB values. /// @param i Row index. /// @param j Column index. /// @param rgb 3D-vector containing the RGB values. /// @return Reference to the image. Image & SetPixel(int i, int j, Eigen::Vector3i const& rgb); /// @brief Sets the given pixel to the given RGB values. /// @param pos 2D vector containing the row and column indices. /// @param rgb 3D-vector containing the RGB values. /// @return Reference to the image. Image & SetPixel(Eigen::Vector2i const& pos, Eigen::Vector3i const& rgb); /// @brief Accesses the value at the given index of the raw image data. /// @param i Index of the element. Max is (width * height * depth) - 1. /// @return The value at the given index of the raw image data. unsigned char operator[](int i) const; private: Image(Image const& other) = delete; // Copy constructor (deleted) int width; int height; int depth; unsigned char* data; }; #endif