複製鏈接
請複製以下鏈接發送給好友

RGB555

鎖定
RGB 555是一種16位的顏色格式。
外文名
RGB555
類    別
顏色格式
RGB 555
每個像素由兩個字節表示。字符555表示每個顏色值所使用的位數。在這種情況下,每個顏色值使用5位,所以只需要15位。最後一位(最重要的位)是未使用的。圖像緩衝區中像素的組織是從左到右和從下到上。
內存佈局
此處為圖1
如上所述,單詞的5個最不重要位對應於藍色值,位5-9對應綠色值,位10至14對應於紅色值。在這種情況下,第15位是未使用的。請注意,在x86體系結構上,單詞是按小字節順序存儲的,這意味着首先保存的是低字節。當使用字節指針訪問圖像數據時,這一點很重要。
如何讀寫像素數據
必須首先設置視頻捕獲設備、視頻格式、具有MemBufferCollection的FrameHandlerSink,它定義了圖像數據顏色格式。下面的代碼片段顯示瞭如何一步一步地訪問和操作RGB 555的像素數據。
首先,我們必須捕捉一個圖像。否則,圖像緩衝區將為空。為此,我們啓動實時模式並調用Grabber::快照。
訪問緩衝區
以下代碼檢索指向圖像數據的指針。請注意,getPtr()返回一個字節指針,該指針將被類型轉換為一個Word指針。這使得訪問像素數據更加容易。
Word*pwImgData=(word*)pActiveBuf->getPtr();
在本例中,我們希望輸出圖像的第一個(左上)像素,並操作前3個像素。正如前面提到的,圖像數據是自下而上存儲的。因此,pwImgData指向緩衝區中最後一行的第一個像素的第一個字節。要訪問第一個字節,必須執行以下計算:
//計算左上角像素的索引
//圖像倒置存儲在圖像緩衝區中
//*1:像素為2字節,但由於我們有一個字指針(也是2個字節)
//我們以像素計算,而不是以字節為單位
大小為DIM=pActiveBuf->getFrameType().DIM;
INT ioffsUpperLeft=(dim.cy-1)*dim.cx*1;
首先,我們以像素的形式檢索圖像的寬度和高度。然後,計算到左上角像素的偏移量。請注意,我們用寬度*1而不是寬度*2進行乘法。這是因為我們使用一個字指針來訪問圖像數據。當然,乘1的乘法只是為了説明,可以忽略不計。
(高度-1)*寬度
既然我們有了第一個像素的偏移量,我們就可以讀出它了:
//請注意:RGB值按以下順序存儲在一個單詞中:r、G、B
//一個二進制文件,並使用顏色掩碼進行操作以提取特定顏色。
//在AND操作之後,進行右移位,以便正確顯示輸出。
Printf(“\n圖像緩衝像素格式為eRGB 555\n”);
Printf(“Pixel 1(RGB):%d%d%d\n”,(pwImgData[iOffsUpperLeft]&eRGB 555_R)>10,
(pwImgData[iOffsUpperLeft]&eRGB 555_G)>>5,
(pwImgData[iOffsUpperLeft]&eRGB 555_B);
Printf(“Pixel 2(RGB):%d%d%d\n”,(pwImgData[ioffsUpperLeft+1]&eRGB 555_R)>10,
(pwImgData[iOffsUpperLeft+1]&eRGB 555_G)>>5,
(pwImgData[iOffsUpperLeft+1]&eRGB 555_B);
如上面的代碼所示,我們執行一個二進制操作,並在當前像素上使用適當的像素掩碼來提取顏色值。在此之後,必須將紅色和綠色的值右移以獲得正確的值(否則值將為1024(32倍))。
操縱圖像數據
在分配值時,移位也很重要。例如,如果將7賦值給紅色值,則必須向左移動10次。而不是寫:
//將7賦值為紅色
PwImgData[iOffsUpperLeft]=7;//這是錯誤的
如果將7賦值為藍色值,則應使用以下代碼:
//將7賦值為紅色
PwImgData[iOffsUpperLeft]=7<10;
另一個重要的注意事項是,上面的賦值將覆蓋綠色和藍色的值。為了防止這種情況,必須將該值安裝到像素數據,如下代碼所示:
//清除紅色值(將所有位設置為0)
PwImgData[iOffsUpperLeft]&=~eRGB 555_R;
//將7賦值為紅色值,而不覆蓋綠色和藍色值
PwImgData[iOffsUpperLeft]x=7<10;
請注意,所有適當顏色的位都應該設置為0,就像上面的代碼一樣。例如,考慮到以前的紅色值可能是16(或10000二進制)。如果我們使用7(或111個二進制)執行二進制或操作,結果將是23(或10111二進制)。因此,最好將適當信道的所有位設置為0。
現在,我們將左上角像素設置為紅色,下一個像素設置為綠色,第三個像素設置為藍色。
//覆蓋前3個像素並將圖像保存到磁盤
//將第一個像素設置為紅色
PwImgData[iOffsUpperLeft]=0;//清除像素
PwImgData[iOffsUpperLeft]AC.26=31<<10;//為red賦值
//將第二個像素設置為綠色
PwImgData[iOffsUpperLeft+1]=0;//清除像素
PwImgData[iOffsUpperLeft+1]AC.26=31<5;//為Green賦值
//將第三個像素設置為藍色
PwImgData[iOffsUpperLeft+2]=0;//清除像素
PwImgData[iOffsUpperLeft+2]AC.26=31;//為Blue賦值
PActiveBuf->Save(“RGB 555.bmp”);
要檢查結果,只需打開保存的圖像並檢查左上角像素。它們應如下所示:
此處為圖2