8bit 與 32bit 失真問題 |
尚未結案
|
paulcaptain
一般會員 發表:13 回覆:9 積分:4 註冊:2004-11-17 發送簡訊給我 |
我測試一張影像深度為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 發送簡訊給我 |
第一個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]‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |