全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2605
推到 Plurk!
推到 Facebook!

關於ScanLine的RGB排列方式

答題得分者是:brook
bowenc
一般會員


發表:10
回覆:12
積分:4
註冊:2003-03-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-29 00:19:15 IP:210.60.xxx.xxx 未訂閱
我利用Panel把MediaPlayer影片轉到MyBmp 我在顯示器32bit的模式下使用ScanLine如下
        for(int y=0;yScanLine[y];
                for(int x=0;xWidth;x  )            
                {
                        array_b[x][y]=ptr[x*3];
                        array_g[x][y]=ptr[x*3 1];
                        array_r[x][y]=ptr[x*3 2];
                }
        }
        //------------------輸出RGB值------------------------------------------
         for(int y=0;yScanLine[y];
                for(int x=0;xWidth;x  )
                {
                        ptr_1[x*3]  =(byte)array_b[x][y];
                        ptr_1[x*3 1]=(byte)array_g[x][y];
                        ptr_1[x*3 2]=(byte)array_r[x][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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-29 09:28:35 IP:61.230.xxx.xxx 未訂閱
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;yScanLine[y];
                for(int x=0;xWidth;x  )            
                {
                        array_b[x][y]=ptr[0];
                        array_g[x][y]=ptr[1];
                        array_r[x][y]=ptr[2];
                        ptr  = searchstep;
                }
        }
        //------------------輸出RGB值------------------------------------------
         for(int y=0;yScanLine[y];
                for(int x=0;xWidth;x  )
                {
                        ptr_1[0]  =(byte)array_b[x][y];
                        ptr_1[1]  =(byte)array_g[x][y];
                        ptr_1[2]  =(byte)array_r[x][y];
                        ptr  = searchstep;
                }
         }
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-29 09:41:48 IP:218.160.xxx.xxx 未訂閱
引言: 或是可以強制一個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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-29 14:21:19 IP:210.60.xxx.xxx 未訂閱
我決定放棄原本的方法了.... 因為發現之前的觀念錯了 在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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-29 15:49:01 IP:61.230.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-29 21:04:27 IP:210.60.xxx.xxx 未訂閱
謝謝指正~我的知識又增加了 而下面這幾行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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-30 09:09:43 IP:61.230.xxx.xxx 未訂閱
引言: 因此我想不如就把這個問題丟給物件去做吧 用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。 因為對這方面有點疑惑,想多了解,所以問得比較多,請見諒。
系統時間:2024-05-21 7:59:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!