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

8bit 與 32bit 失真問題

尚未結案
paulcaptain
一般會員


發表:13
回覆:9
積分:4
註冊:2004-11-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-04-10 17:35:20 IP:140.138.xxx.xxx 訂閱
我測試一張影像深度為8bit影像,我在作影像強化時發現了這個問題,於是我寫了一段程式試圖想找出問題,以下是我的程式碼:

開啟圖檔(開圖程式)部分:
[code cpp]
if(OpenPictureDialog1->Execute())
{
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
Image1->Picture->Bitmap->PixelFormat = pf8bit;
}
[/code]

接下來執行下面程式:
[code cpp]
double **image;
image = new double*[height];
for(int i = 0 ; i < height ; i ){image[i] = new double[width];}
//使用ScanLine讀入影像資訊
for(int i = 0 ; i < height ; i )
{
byte *ptr = (byte*) Image1->Picture->Bitmap->ScanLine[i];
for(int j = 0 ; j < width ; j )
{
byte value = ptr[j];
image[i][j] = value;
}
}
//繪圖於Image1上並存檔
Graphics::TBitmap* BMP = new Graphics::TBitmap();
BMP->Width = width;
BMP->Height = height;
for(int i = 0 ; i < BMP->Height ; i )
{
for(int j = 0 ; j < BMP->Width ; j )
{
byte value = image[i][j];
SetPixel(BMP->Canvas->Handle,j,i,TColor(RGB(value,value,value)));
}
}
Image1->Picture->Assign(BMP);
//Image1->Picture->Bitmap->PixelFormat = pf8bit;//****
Image1->Picture->SaveToFile("test.bmp");//我認為此處存檔時存成了32bits
delete BMP;
//delete動態陣列
for(int i = 0 ; i < height ; i ){delete image[i];}
delete image;
[/code]
我首先測試:
(A)執行時先將要測試的8bit影像開啟->然後Load進陣列當中->在BMP上繪製後assign在Image1上存檔
接下來在用同樣開圖程式開啟,結果失真
我將//****的註解反註解掉再執行(A),同樣用開圖程式開啟,結果還是失真

不知道是否有人跟我一樣有遇到相同的問題?我所使用的8bit影像,完全沒經過任何變動,只是存成陣列再繪圖,居然會自己變成32bits
是我程式哪部分有問題,或是其中有更深函的意義嗎?
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-04-12 14:55:50 IP:59.112.xxx.xxx 未訂閱
第一個8bit變成32bit的原因是

Graphics::TBitmap* BMP = new Graphics::TBitmap();
你在動態產生BMP這個物件的時候,沒有指定他的PixelFormat
而且後面使用SetPixel(BMP->Canvas->Handle,j,i,TColor(RGB(value,value,value)));將RGB存入
所以格式自然會是32bit

第二個陣列要存回圖片,可以直接使用scanline回存
[code cpp]
for(int i = 0 ; i < height ; i )
{
byte *ptr = (byte*) Image1->Picture->Bitmap->ScanLine[i];
for(int j = 0 ; j < width ; j )
{
ptr[j]=image[i][j] ; //回寫至圖片
}
}
[/code]

但是要注意一件重要的事情,
image[i][j]是double格式
ptr[]是byte
所以寫回去的時候要注意是否會溢位(例如image[i][j]>255 or <0)
編輯記錄
daldal 重新編輯於 2008-04-12 14:56:42, 註解 加上[code][/code]‧
系統時間:2024-12-05 3:43:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!