線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2054
推到 Plurk!
推到 Facebook!

輸入不同位元圖片的輸出問題

答題得分者是:wubelin
yulong375
一般會員


發表:2
回覆:22
積分:19
註冊:2007-03-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-01-24 15:48:47 IP:140.128.xxx.xxx 訂閱
輸入圖片有可能是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;iHeight;i )
{
ptr=(Byte *)Bmp->ScanLine[i];
for (int j=0;jWidth;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 Height ; Row )
{
RGBQUAD *Pixel1 = (RGBQUAD *) Pic1->ScanLine[Row];
for (int Col=0; Col Width; Col , Pixel1 )
{
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位元?
測試圖片請於附件下載!!

------
我還是很新的新手,如果回答的太笨拙還請各位多多包含!!
附加檔案:479842df2ee56_test.rar
wubelin
一般會員


發表:2
回覆:14
積分:18
註冊:2007-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-02-15 09:16:09 IP:61.60.xxx.xxx 訂閱
我有一個想法,不知你有沒有興趣試試 

先將輸入的圖片轉成24bit (如果不是24bit),然後再轉矩陣
這樣還原應該就可以用24bit了
yulong375
一般會員


發表:2
回覆:22
積分:19
註冊:2007-03-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-02-15 15:36:31 IP:218.162.xxx.xxx 訂閱
那想請問一下,目前的寫法不管輸入是24bit或32bit的圖,輸出皆為32bit,
那程式該怎麼寫,才能使32bit的圖輸出為24bit呢?

小弟不材,還望高人指點迷經。
------
我還是很新的新手,如果回答的太笨拙還請各位多多包含!!
wubelin
一般會員


發表:2
回覆:14
積分:18
註冊:2007-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-02-22 13:34:45 IP:61.60.xxx.xxx 訂閱
把32bit的R、G、B 放到24bit的R、G、B
↓看得懂吧,用你的改的= =
[code cpp]
  1. for (int i=0;iHeight;i )
  2. {
  3. ptr=(Byte *)Bmp24->ScanLine[i];
  4. ptr1=(Byte *)Bmp32->ScanLine[i];
  5. for (int j=0;jWidth;j )
  6. {
  7. ptr[j*3] = ptr1[j*4];
  8. ptr[j*3 1] = ptr1[j*4 1];
  9. ptr[j*3 2] = ptr1[j*4 2];
  10. }
  11. }
    [/code]
wubelin
一般會員


發表:2
回覆:14
積分:18
註冊:2007-10-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-02-24 02:56:45 IP:60.198.xxx.xxx 訂閱
抱歉,現在才發現= ="
上面貼了些奇怪的東西= =
而且我也不知道怎麼編輯文章

只要把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]
yulong375
一般會員


發表:2
回覆:22
積分:19
註冊:2007-03-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-02-25 18:04:11 IP:218.162.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-02-28 13:24:39 IP:61.60.xxx.xxx 訂閱

[code cpp]
if(InputBmp->PixelFormat == pf32bit)
{
...
}
else if(InputBmp->PixelFormat == pf24bit)
{
...
}
[/code]
用這個判斷就行了
wubelin
一般會員


發表:2
回覆:14
積分:18
註冊:2007-10-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-02-28 13:27:32 IP:61.60.xxx.xxx 訂閱
原來我在這複製文字會這樣= = "
只要判斷輸入的圖片是幾位元,再做處理就行了
===================引 用 wubelin 文 章===================

[code cpp]
if(InputBmp->PixelFormat == pf32bit)
{
...
}
else if(InputBmp->PixelFormat == pf24bit)
{
...
}
[/code]
用這個判斷就行了
yulong375
一般會員


發表:2
回覆:22
積分:19
註冊:2007-03-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-02-29 22:27:24 IP:140.128.xxx.xxx 訂閱
感謝wubelin兄,自動偵測輸入圖片的位元數以解決。

那可否再請教一下,程式該如何改寫,才能使圖片用矩陣的方式輸出24bit 呢?

問題那麼多,還請wubelin兄多多包含...
------
我還是很新的新手,如果回答的太笨拙還請各位多多包含!!
wubelin
一般會員


發表:2
回覆:14
積分:18
註冊:2007-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-03-01 09:36:31 IP:61.60.xxx.xxx 訂閱

[code cpp]
Pic1->PixelFormat = pf24bit; ←改成24bit就行了吧
for (int Row=0; Row Height ; Row )
{
RGBQUAD *Pixel1 = (RGBQUAD *) Pic1->ScanLine[Row];
for (int Col=0; Col Width; Col , Pixel1 )
{
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-03-01 19:16:58 IP:140.128.xxx.xxx 訂閱

[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;iHeight;i )
{
ptr=(Byte *)Bmp->ScanLine[i];
for (int j=0;jWidth;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 Height ; Row )
{
RGBQUAD *Pixel1 = (RGBQUAD *) Pic1->ScanLine[Row];
for (int Col=0; Col Width; Col , Pixel1 )
{
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 重新編輯於 2008-03-01 19:22:23, 註解 無‧
yulong375 重新編輯於 2008-03-01 19:27:46, 註解 無‧
yulong375 重新編輯於 2008-03-01 19:28:32, 註解 無‧
yulong375 重新編輯於 2008-03-01 19:48:27, 註解 無‧
yulong375 重新編輯於 2008-03-01 19:50:19, 註解 無‧
yulong375 重新編輯於 2008-03-01 19:53:30, 註解 無‧
yulong375
一般會員


發表:2
回覆:22
積分:19
註冊:2007-03-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-03-01 22:36:48 IP:140.128.xxx.xxx 訂閱
我去網路上查了一下 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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-03-01 23:31:26 IP:140.128.xxx.xxx 訂閱

經過不斷的嘗試終於成功了。
後來我不使用RGBQUAD,改用指標的方式寫,這樣就不用考慮RGBQUAD的保留區問題了。
再次感謝wubelin兄的指導與啟示。
以下是修正過後的程式碼。
[code cpp]

Pic1->PixelFormat = pf24bit;
for (int Row=0; Row Height ; Row )
{
RGBQUAD *Pixel1 = (RGBQUAD *) Pic1->ScanLine[Row];
for (int Col=0; Col Width; Col , Pixel1 )
{
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 Height ; Row )
{
Byte *prt24 = (Byte *) Pic1->ScanLine[Row];
for (int Col=0; Col Width; 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, 註解 無‧
系統時間:2024-04-26 0:41:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!