RGB to HSV conversion
This commit is contained in:
36
color.cc
36
color.cc
@@ -2,3 +2,39 @@
|
|||||||
|
|
||||||
RgbColor::RgbColor(const Color<3>& src)
|
RgbColor::RgbColor(const Color<3>& src)
|
||||||
: Color<3>(src) {}
|
: Color<3>(src) {}
|
||||||
|
|
||||||
|
RgbColor::operator HsvColor() const {
|
||||||
|
constexpr int32_t kSection = kNumColors / 6;
|
||||||
|
int32_t max = *std::max_element(this->begin(), this->end());
|
||||||
|
int32_t min = *std::min_element(this->begin(), this->end());
|
||||||
|
int32_t delta = max - min;
|
||||||
|
|
||||||
|
if (delta == 0) {
|
||||||
|
return {{{{{0x0000, 0x0000, max}}}}};
|
||||||
|
}
|
||||||
|
|
||||||
|
HsvColor ret = {{{{{0, 0, max}}}}};
|
||||||
|
|
||||||
|
if (max == this->at(0)) {
|
||||||
|
ret.at(0) = (kSection * (this->at(1) - this->at(2))) / delta + (0 * kSection);
|
||||||
|
} else if (max == this->at(1)) {
|
||||||
|
ret.at(0) = (kSection * (this->at(2) - this->at(0))) / delta + (2 * kSection);
|
||||||
|
} else {
|
||||||
|
assert(max == this->at(2));
|
||||||
|
ret.at(0) = (kSection * (this->at(0) - this->at(1))) / delta + (4 * kSection);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret.at(0) < 0) {
|
||||||
|
ret.at(0) += kNumColors;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max > 0) {
|
||||||
|
ret.at(1) = static_cast<int32_t>(static_cast<int64_t>(delta) * kMaxColor / max);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HsvColor::HsvColor(const Color<3>& src)
|
||||||
|
: Color<3>(src) {}
|
||||||
|
|||||||
16
color.h
16
color.h
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
constexpr int32_t kMinColor = 0;
|
constexpr int32_t kMinColor = 0;
|
||||||
constexpr int32_t kMaxColor = UINT16_MAX;
|
constexpr int32_t kMaxColor = UINT16_MAX;
|
||||||
|
constexpr int32_t kNumColors = (kMaxColor - kMinColor) + 1;
|
||||||
|
|
||||||
class ColorBase {};
|
class ColorBase {};
|
||||||
|
|
||||||
@@ -20,10 +21,21 @@ struct Color : public Array<int32_t, C>, public ColorBase {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct RgbColor;
|
||||||
|
struct HsvColor;
|
||||||
|
|
||||||
|
|
||||||
struct RgbColor : public Color<3> {
|
struct RgbColor : public Color<3> {
|
||||||
public:
|
|
||||||
RgbColor() = default;
|
RgbColor() = default;
|
||||||
RgbColor(const Color<3>& src);
|
RgbColor(const Color<3>& src);
|
||||||
|
|
||||||
|
operator HsvColor() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct HsvColor : public Color<3> {
|
||||||
|
HsvColor() = default;
|
||||||
|
HsvColor(const Color<3>& src);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -58,7 +70,7 @@ template <int32_t C>
|
|||||||
std::ostream& operator<<(std::ostream& os, const Color<C>& color) {
|
std::ostream& operator<<(std::ostream& os, const Color<C>& color) {
|
||||||
os << std::hex << std::setfill('0') << "Color(";
|
os << std::hex << std::setfill('0') << "Color(";
|
||||||
for (int32_t c = 0; c < C; ++c) {
|
for (int32_t c = 0; c < C; ++c) {
|
||||||
os << "0x" << std::setw(4) << color.at(0);
|
os << "0x" << std::setw(4) << color.at(c);
|
||||||
if (c < C - 1) {
|
if (c < C - 1) {
|
||||||
os << ", ";
|
os << ", ";
|
||||||
}
|
}
|
||||||
|
|||||||
3
image.h
3
image.h
@@ -13,8 +13,7 @@ class ImageBase {};
|
|||||||
|
|
||||||
|
|
||||||
template <class C>
|
template <class C>
|
||||||
class ImageColorBase : public ImageBase {
|
struct ImageColorBase : public ImageBase {
|
||||||
public:
|
|
||||||
ImageColorBase() = default;
|
ImageColorBase() = default;
|
||||||
ImageColorBase(const ImageColorBase<C>&) = default;
|
ImageColorBase(const ImageColorBase<C>&) = default;
|
||||||
virtual ~ImageColorBase() = default;
|
virtual ~ImageColorBase() = default;
|
||||||
|
|||||||
Reference in New Issue
Block a user