關於ScanLine的RGB排列方式 |
答題得分者是:brook
|
bowenc
一般會員 發表:10 回覆:12 積分:4 註冊:2003-03-06 發送簡訊給我 |
我利用Panel把MediaPlayer影片轉到MyBmp
我在顯示器32bit的模式下使用ScanLine如下
for(int y=0;y測試結果顯示出來的圖右邊一部分不見了 我就把ptr改成一次乘4變成ptr[x*4] 顯示就正常了 可是我在24或16bit的顯示之下又要把他改成ptr[x*3] 我試著加上MyBmp_1->PixelFormat = pf24bit; 結果也沒有辦法在32bit模式下顯示正常 不知道是否有辦法偵測到使用者是在什麼模式下使用程式 或是可以強制一個pixel都是3byte? 還是有更好的辦法可以解決此問題? 發表人 - bowenc 於 2003/08/29 00:51:35 |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
bowenc你好: 也許可以先這樣做看看,先得知pixelformat,再處理
int searchstep = 3; //default 3 switch(MyBmp_1->PixelFormat) { case pf16bit: case pf24bit: searchstep = 3; break; case pf32bit: searchstep = 4; break; } for(int y=0;y |
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
引言: 或是可以強制一個pixel都是3byte?加上MyBmp_1->PixelFormat = pf24bit; 你也可用32bit的模式 1.加上MyBmp_1->PixelFormat = pf32bit; 2.ptr=(TColor *)MyBmp->ScanLine[y]; // 但要宣告 TColor *ptr; 3.取顏色用 GetRValue(ptr[x]);GetGValue(ptr[x]);GetBValue(ptr[x]); 4.設顏色用 RGB(r, g ,b); |
bowenc
一般會員 發表:10 回覆:12 積分:4 註冊:2003-03-06 發送簡訊給我 |
我決定放棄原本的方法了....
因為發現之前的觀念錯了
在32bits之下,一個pixel是4byte,RGBa各一個byte
24bits之下,一個pixel是3byte,RGBa一個值佔6bit
16bits是RGBa一個值佔4bit
8bits是RGBa一個值佔2bit
所以除了32bits的模式下是剛好一個byte其他的都是小於一個byte
這樣子對宣告成byte的ptr沒有辦法存取
然而,強制用MyBmp_1->PixelFormat = pf32bit;
我試了之後卻沒有效果....不知道為什麼....在除了32bits以外都是會出錯
所以在取RGB方面我決定用
GetRValue(ptr[x]);GetGValue(ptr[x]);GetBValue(ptr[x]);的方法 謝謝大家的回答:)
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
bowenc你好: 下面是小弟對bitmap的認知,稍微改了一下 32bits之下,一個pixel是4byte,RGB各一個byte,多一個byte另有用途。
24bits之下,一個pixel是3byte,RGB各一個byte。
16bits是RGB三個顏色合成,比率是5:6:5。每一pixel占16 bits(2bytes)
8bits是RGB就是256色囉,每一pixel占8 bits(1bytes) #define GetRValue(rgb) ((BYTE) (rgb))
#define GetGValue(rgb) ((BYTE) (((WORD) (rgb)) >> 8))
#define GetBValue(rgb) ((BYTE) ((rgb) >> 16)) 由此可見,用Get的結果跟使用scanline是一樣的, 請問一下,試了下面這幾行code可行嗎?
switch(MyBmp_1->PixelFormat) { case pf16bit: case pf24bit: searchstep = 3; break; case pf32bit: searchstep = 4; break; } |
bowenc
一般會員 發表:10 回覆:12 積分:4 註冊:2003-03-06 發送簡訊給我 |
謝謝指正~我的知識又增加了 而下面這幾行code
switch(MyBmp_1->PixelFormat)
{
case pf16bit:
case pf24bit:
searchstep = 3;
break;
case pf32bit:
searchstep = 4;
break;
}
16bit模式下是跟24bit一樣一次跳3個byte,也就是一個pixel是3byte
所以在32bit和24bit正確,可是在16bit會出錯
而且就如J大說的16bit是按比例去算的
所以要用scanline可能會有些許的困難
因為ptr一次是取一個byte,如果searchstep = 2
一個pixel當作2byte是沒錯
可是要如何從2個byte中用5:6:5的方式取出RGB我就不知該如何做了
因此我想不如就把這個問題丟給物件去做吧
用GetRValue,GetGalue,GetBValue就不用去考慮佔幾個byte了
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: 因此我想不如就把這個問題丟給物件去做吧 用GetRValue,GetGalue,GetBValue就不用去考慮佔幾個byte了#define GetRValue(rgb) ((BYTE) (rgb)) #define GetGValue(rgb) ((BYTE) (((WORD) (rgb)) >> 8)) #define GetBValue(rgb) ((BYTE) ((rgb) >> 16)) 上面是由c 的說明檔擷取下來的,GetXValue是這樣產生 如果用GetValue是正確的,那跟使用scanline的原理是一 樣的,應該也能用scanline。 因為對這方面有點疑惑,想多了解,所以問得比較多,請見諒。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |