色彩轉換結構應用C/C++的Struct與Union

這是一個關於我在影像處理程式中很想很久的問題,

可以用一個結構就能r,g,b存取一個像素,或是其他的色彩空間名稱,如xyz、yuv、ycbcr等。

不過寫出來之後還是不很理想,或許還是得用類別才是最好的解決方法。

利用的是結構中的巢狀匿名結構成員,這些匿名的結構中的成員最後都會成為最上層的結構的成員。 (from C++ Primer)

#include <iostream>

using namespace std;

typedef struct
{
  union
  {
        struct
        {
              int r, g, b;
        };
        

        // 當沒有變數名稱相同的時候 
        struct
        {
              float h, s, i;
        };

        // 當有變數名稱相同的時候 
        struct
        {
              float y;
              
              // 因為名稱同樣有y, 所以 y 自己成為一個欄位 
              union{
                   struct{
                          float u, v;
                          };
                   struct{
                          float x, z; 
                          };
                   struct{
                          float cb, cr;
                          };
              };
        }; 
  };
  
} Pixel;

int main()
{
    float a,b,c;
    Pixel p;
    
    // 測試1
    // 儲存int的資料, 然後看看float的資料直接輸出會得到什麼結果 
    p.r = 0;
    p.g = 1;    
    p.b = 2;
    cout <"=== test1 ===" <endl;
    cout <<"p.y=" << p.y << endl;
    cout <"p.u=" << p.u << endl;
    cout <"p.v=" << p.v << endl;
    cout <endl;    

    // 暫存起來以便test3測試用 
    a = p.y;
    b = p.u;
    c = p.v;

    // 測試2 
    // 儲存float的資料, 然後看看int的資料直接輸出會得到什麼結果 
    p.y = 1.0;
    p.u = 2.0;    
    p.v = 3.0;
    cout <"=== test2 ===" <endl;
    cout <"p.r=" << p.r << endl;
    cout <"p.g=" << p.g << endl;
    cout <"p.b=" << p.b << endl;
    cout <endl;

    // 測試3 
    // 由於p內的成員都在測試2中被改掉了, 所以不存測試1的數值
    // 那我們把測試1的得到的 float 資料放回去 p, 看是不是可以還原回測試1中給定的資料 
    p.y = a;
    p.u = b;
    p.v = c;
    cout <"=== test3 ===" << endl;
    cout <"p.r=" << p.r << endl;
    cout <"p.g=" << p.g << endl;
    cout <"p.b=" << p.b << endl;    
    
    return 0;
}

留言