色彩轉換結構應用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;
}
可以用一個結構就能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;
}
留言