輸入不同位元圖片的輸出問題 |
答題得分者是:wubelin
|
yulong375
一般會員 發表:2 回覆:22 積分:19 註冊:2007-03-15 發送簡訊給我 |
輸入圖片有可能是24bit 或是 32bit
下面是 圖轉矩陣 -> 矩陣再轉圖的程式 沒有任何功能..... [code cpp] void __fastcall TForm1::Btn_ScanClick(TObject *Sender) { Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Bmp->Assign(Image1->Picture->Bitmap); Byte *ptr; Pic1 = Image1->Picture->Bitmap; for (int i=0;i { ptr=(Byte *)Bmp->ScanLine[i]; for (int j=0;j { if (RadioGroup1->ItemIndex==0).....需手動調整的麻煩 { OrgBuff[i][j][0] = ptr[j*3]; OrgBuff[i][j][1] = ptr[j*3 1]; .......方案A:24bit的取色 OrgBuff[i][j][2] = ptr[j*3 2]; ShowBuff[i][j][0] = OrgBuff[i][j][0]; ShowBuff[i][j][1] = OrgBuff[i][j][1]; ShowBuff[i][j][2] = OrgBuff[i][j][2]; picBuff[i][j] = OrgBuff[i][j][2]; } else if (RadioGroup1->ItemIndex==1) { OrgBuff[i][j][0] = ptr[j*4]; OrgBuff[i][j][1] = ptr[j*4 1]; .......方案B:32bit的取色;不太了解為什麼*4 OrgBuff[i][j][2] = ptr[j*4 2]; ShowBuff[i][j][0] = OrgBuff[i][j][0]; ShowBuff[i][j][1] = OrgBuff[i][j][1]; ShowBuff[i][j][2] = OrgBuff[i][j][2]; picBuff[i][j] = OrgBuff[i][j][2]; } } } Pic1->PixelFormat = pf32bit; .....問題2 for (int Row=0; Row { RGBQUAD *Pixel1 = (RGBQUAD *) Pic1->ScanLine[Row]; for (int Col=0; Col { Pixel1->rgbBlue = (BYTE) ShowBuff[Row][Col][0]; Pixel1->rgbGreen = (BYTE) ShowBuff[Row][Col][1]; Pixel1->rgbRed = (BYTE) ShowBuff[Row][Col][2]; } } Image1->Invalidate(); countpoint = 0; } [/code] 詳細問題: 我試了以上程式的結論 如果我輸入24bit的圖片 那麼就需使用方案A,且Pic1->PixelFormat = pf32bit;那行必須是pf32bit 如果我輸入32bit的圖片 那麼就需使用方案B,且Pic1->PixelFormat = pf32bit;那行也必須是pf32bit 那該如何做才能不管輸入的圖片不管為多少位元都能輸出24位元? 測試圖片請於附件下載!!
------
我還是很新的新手,如果回答的太笨拙還請各位多多包含!! |
wubelin
一般會員 發表:2 回覆:14 積分:18 註冊:2007-10-04 發送簡訊給我 |
|
yulong375
一般會員 發表:2 回覆:22 積分:19 註冊:2007-03-15 發送簡訊給我 |
|
wubelin
一般會員 發表:2 回覆:14 積分:18 註冊:2007-10-04 發送簡訊給我 |
把32bit的R、G、B 放到24bit的R、G、B
↓看得懂吧,用你的改的= = [code cpp]
|
wubelin
一般會員 發表:2 回覆:14 積分:18 註冊:2007-10-04 發送簡訊給我 |
|
yulong375
一般會員 發表:2 回覆:22 積分:19 註冊:2007-03-15 發送簡訊給我 |
===================引 用 wubelin 文 章=================== 抱歉,現在才發現= =" 上面貼了些奇怪的東西= = 而且我也不知道怎麼編輯文章 只要把32bit中的24bit 拿來用就好 [code cpp] ptr24[j*3] = ptr32[j*4]; ptr24[j*3 1] = ptr32[j*4 1]; ptr24[j*3 2] = ptr32[j*4 2]; [/code] wubelin大大請問一下 如果照你這個方法,一開始好像也要先手動選擇輸入是24BIT或32BIT。 有指令或是方法可以偵測圖片是24BIT或32BIT嗎? 以及我的程式中 Pic1->PixelFormat = pf32bit; 這行是指定Pic1為32Bit, 如果將這行改成Pic1->PixelFormat = pf24bit; 則會使圖片變成下面這樣 -------------Input------------- -----------Output------------ 程式該如何改寫才能正常顯示呢? 小弟不材還望高人多多指點.....
------
我還是很新的新手,如果回答的太笨拙還請各位多多包含!!
編輯記錄
yulong375 重新編輯於 2008-02-25 18:05:46, 註解 無‧
|
wubelin
一般會員 發表:2 回覆:14 積分:18 註冊:2007-10-04 發送簡訊給我 |
|
wubelin
一般會員 發表:2 回覆:14 積分:18 註冊:2007-10-04 發送簡訊給我 |
|
yulong375
一般會員 發表:2 回覆:22 積分:19 註冊:2007-03-15 發送簡訊給我 |
|
wubelin
一般會員 發表:2 回覆:14 積分:18 註冊:2007-10-04 發送簡訊給我 |
[code cpp] Pic1->PixelFormat = pf24bit; ←改成24bit就行了吧 for (int Row=0; Row { RGBQUAD *Pixel1 = (RGBQUAD *) Pic1->ScanLine[Row]; for (int Col=0; Col { Pixel1->rgbBlue = (BYTE) ShowBuff[Row][Col][0]; Pixel1->rgbGreen = (BYTE) ShowBuff[Row][Col][1]; Pixel1->rgbRed = (BYTE) ShowBuff[Row][Col][2]; } } Image1->Invalidate(); countpoint = 0; [/code] ===================引 用 yulong375 文 章=================== 感謝wubelin兄,自動偵測輸入圖片的位元數以解決。 那可否再請教一下,程式該如何改寫,才能使圖片用矩陣的方式輸出24bit 呢? 問題那麼多,還請wubelin兄多多包含... |
yulong375
一般會員 發表:2 回覆:22 積分:19 註冊:2007-03-15 發送簡訊給我 |
[code cpp] void __fastcall TForm1::Btn_ScanClick(TObject *Sender) { Graphics::TBitmap *Bmp = new Graphics::TBitmap(); Bmp->Assign(Image1->Picture->Bitmap); Byte *ptr; Pic1 = Image1->Picture->Bitmap; for (int i=0;i { ptr=(Byte *)Bmp->ScanLine[i]; for (int j=0;j { if(InputBmp->PixelFormat == pf24bit) -----已能自動偵測輸入圖片的位元數 { OrgBuff[i][j][0] = ptr[j*3]; OrgBuff[i][j][1] = ptr[j*3 1]; OrgBuff[i][j][2] = ptr[j*3 2]; ShowBuff[i][j][0] = OrgBuff[i][j][0]; ShowBuff[i][j][1] = OrgBuff[i][j][1]; ShowBuff[i][j][2] = OrgBuff[i][j][2]; picBuff[i][j] = OrgBuff[i][j][2]; } else if(InputBmp->PixelFormat == pf32bit) { OrgBuff[i][j][0] = ptr[j*4]; OrgBuff[i][j][1] = ptr[j*4 1]; OrgBuff[i][j][2] = ptr[j*4 2]; ShowBuff[i][j][0] = OrgBuff[i][j][0]; ShowBuff[i][j][1] = OrgBuff[i][j][1]; ShowBuff[i][j][2] = OrgBuff[i][j][2]; picBuff[i][j] = OrgBuff[i][j][2]; } } } Pic1->PixelFormat = pf24bit; -----照wubelin兄改成pf24bit 後,結果怪怪的。 for (int Row=0; Row { RGBQUAD *Pixel1 = (RGBQUAD *) Pic1->ScanLine[Row]; for (int Col=0; Col { Pixel1->rgbBlue = (BYTE) ShowBuff[Row][Col][0]; Pixel1->rgbGreen = (BYTE) ShowBuff[Row][Col][1]; Pixel1->rgbRed = (BYTE) ShowBuff[Row][Col][2]; } } Image1->Invalidate(); countpoint = 0; } [/code] 輸出影像
------
我還是很新的新手,如果回答的太笨拙還請各位多多包含!! |
yulong375
一般會員 發表:2 回覆:22 積分:19 註冊:2007-03-15 發送簡訊給我 |
我去網路上查了一下 RGBQUAD 的用法,
RGBQUAD 的子函式包括了 rgbBlue, rgbGreen, rgbRed 及 rgbReserved, 因為rgbReserved的存在,所以導致BMP每行長度必須以4的倍數存在, 而32Bit 即為 (2^3)*4 <----其中4也就是分別代表rgbBlue, rgbGreen, rgbRed 及 rgbReserved, 故如果將 Pic1->PixelFormat = pf32bit; 改成 Pic1->PixelFormat = pf24bit; 是不是就會少了一行或多了一行呢?因為圖其實有膨脹的感覺。
------
我還是很新的新手,如果回答的太笨拙還請各位多多包含!! |
yulong375
一般會員 發表:2 回覆:22 積分:19 註冊:2007-03-15 發送簡訊給我 |
經過不斷的嘗試終於成功了。 後來我不使用RGBQUAD,改用指標的方式寫,這樣就不用考慮RGBQUAD的保留區問題了。 再次感謝wubelin兄的指導與啟示。 以下是修正過後的程式碼。 [code cpp] Pic1->PixelFormat = pf24bit; for (int Row=0; Row { RGBQUAD *Pixel1 = (RGBQUAD *) Pic1->ScanLine[Row]; for (int Col=0; Col { Pixel1->rgbBlue = (BYTE) ShowBuff[Row][Col][0]; Pixel1->rgbGreen = (BYTE) ShowBuff[Row][Col][1]; Pixel1->rgbRed = (BYTE) ShowBuff[Row][Col][2]; } } 修改成 Pic1->PixelFormat = pf24bit; for (int Row=0; Row { Byte *prt24 = (Byte *) Pic1->ScanLine[Row]; for (int Col=0; Col { prt24[Col*3] = (BYTE) ShowBuff[Row][Col][0]; prt24[Col*3 1] = (BYTE) ShowBuff[Row][Col][1]; prt24[Col*3 2] = (BYTE) ShowBuff[Row][Col][2]; } } [/code]
------
我還是很新的新手,如果回答的太笨拙還請各位多多包含!!
編輯記錄
yulong375 重新編輯於 2008-03-02 12:31:24, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |