DWORDの中身が、RGBAだとか、BGRAだとか、そういう内部フォーマットはいざ知らず、DWORDのままで色の値の加減算もろくにできやしないので、そういう問題へのソリューションとして、以下便利クラスを作成したメモ。 class Pix { public: Pix(DWORD col) { _r = col & 0x000000ff; _g = (col >> 8) & 0x000000ff; _b = (col >> 16) & 0x000000ff; _a = (col >> 24) & 0x000000ff; } Pix(int r, int g, int b, int a) { _r = r; _g = g; _b = b; _a = a; } ~Pix(void) {} void operator += (const Pix& pix) { _r += pix._r; _g += pix._g; _b += pix._b; _a += pix._a; } void operator /= (const float val) { _r /= val; _g /= val; _b /= val; _a /= val; } Pix operator * (float val) { return Pix(_r*val, _g*val, _b*val, _a*val); } void clamp_0x00_0xff(void) { auto ata = [](int x) { if (x < 0) return 0; else return x; }; auto atap = [](int x) { if (x > 255) return 255; else return x; }; _r = ata(_r); _g = ata(_g); _b = ata(_b); _r = atap(_r); _g = atap(_g); _b = atap(_b); _a = 255; } DWORD GetValue(void) { return _r | (_g << 8) | (_b << 16) | (_a << 24); } int _r, _g, _b, _a; };
具体的な使い方は、一つ前の記事を参照。