Img2Num C++ (Internal Developer Docs) dev
API Documentation
Loading...
Searching...
No Matches
RGBPixel.h
1#ifndef RGBPIXEL_H
2#define RGBPIXEL_H
3
4#include <cmath>
5#include <iostream>
6
7#include "internal/Pixel.h"
8
9namespace ImageLib {
10template <typename NumberT>
11struct RGBPixel : public Pixel<NumberT> {
12 // ----- Members -----
13 NumberT red, green, blue;
14
15 constexpr RGBPixel(NumberT red = 0, NumberT green = 0, NumberT blue = 0)
16 : red(red), green(green), blue(blue) {
17 }
18
19 // ----- Modifiers -----
20 [[nodiscard]] inline bool operator==(const RGBPixel &other) const {
21 return red == other.red && green == other.green && blue == other.blue;
22 }
23 [[nodiscard]] inline bool operator!=(const RGBPixel &other) const {
24 return !(*this == other);
25 }
26
27 // ----- Utilities -----
28 inline void setGray(NumberT gray) {
29 red = green = blue = gray;
30 }
31
32 static inline float colorDistance(const RGBPixel<NumberT> &a, const RGBPixel<NumberT> &b) {
33 RGBPixel<float> af{static_cast<float>(a.red), static_cast<float>(a.green),
34 static_cast<float>(a.blue)};
35 RGBPixel<float> bf{static_cast<float>(b.red), static_cast<float>(b.green),
36 static_cast<float>(b.blue)};
37 return std::sqrt((af.red - bf.red) * (af.red - bf.red) +
38 (af.green - bf.green) * (af.green - bf.green) +
39 (af.blue - bf.blue) * (af.blue - bf.blue));
40 }
41
42} __attribute__((packed));
43
44template <typename NumberT>
45std::ostream &operator<<(std::ostream &out, const ImageLib::RGBPixel<NumberT> &pixel) {
46 out << "( " << pixel.red << "," << pixel.green << "," << pixel.blue << " )";
47 return out;
48}
49
50} // namespace ImageLib
51
52#endif // RGBPIXEL_H