調色盤? |
答題得分者是:senso
|
encoref70036
一般會員 發表:29 回覆:47 積分:15 註冊:2011-05-18 發送簡訊給我 |
你好~
我在版上看到一個8位元彩色轉8位元灰階的程式 他雖然有註解了 但有些地方還是不懂 以下是程式碼~ //--------------------------------------------------------------------------- //從彩色256色圖檔轉成256灰階圖檔 void __fastcall TForm1::Button1Click(TObject *Sender) {//先建立一暫時圖檔,並將Image1複製過來 Graphics::TBitmap *tmpBmp = new Graphics::TBitmap(); tmpBmp->Assign(Image1->Picture->Bitmap); //再設定暫時圖檔為8位元(256色) tmpBmp->PixelFormat = pf8bit; //宣告色盤結構陣列 PALETTEENTRY greyPal[256]; //將暫時圖檔色盤分離出來,並另建一色盤結構 HPALETTE hPal = tmpBmp->ReleasePalette(); //由暫時圖檔複製色盤至色盤結構陣列 if(::GetPaletteEntries(hPal, 0, 256, greyPal)) { for (int index = 0; index < 256; index ) {//從RGB轉換至最接近的灰度值 int gray = 0.114*(double)greyPal[index].peBlue 0.587*(double)greyPal[index].peGreen 0.299*(double)greyPal[index].peRed; //限制顏色範圍 if(gray <= 0) gray = 0; if(gray >= 255) gray = 255; //當RGB同為一值時,即顯示為灰階 greyPal[index].peBlue = (unsigned short)gray; greyPal[index].peGreen = (unsigned short)gray; greyPal[index].peRed = (unsigned short)gray; greyPal[index].peFlags = NULL; } //再將修改色盤指派給Image1色盤 ::SetPaletteEntries(hPal, 0, 256, greyPal); tmpBmp->Palette = hPal; } Image1->Picture->Bitmap->Assign(tmpBmp); delete tmpBmp; } //--------------------------------------------------------------------------- GetPaletteEntries、SetPaletteEntries怎麼用呢? 麻煩大俠了~ 感恩 編輯記錄
encoref70036 重新編輯於 2011-07-28 09:25:29, 註解 無‧
encoref70036 重新編輯於 2011-07-28 09:31:44, 註解 無‧ encoref70036 重新編輯於 2011-07-28 09:32:59, 註解 無‧ |
senso
高階會員 發表:5 回覆:126 積分:226 註冊:2003-11-27 發送簡訊給我 |
HPALETTE hPal; //這是handle
PALETTEENTRY greyPal[256]; //這才是調色盤陣列 參考Help GetPaletteEntries或SetPaletteEntries( HPALETTE hpal, // handle to logical palette UINT iStartIndex, // first entry to retrieve,基本上就0 UINT nEntries, // number of entries to retrieve,8bit所以是256 LPPALETTEENTRY lppe // array that receives entries,上面宣告的greyPal ); 這段code是將原本256color的調色盤的內容改成灰階 1.先ReleasePalette並取得handle 2.GetPaletteEntries丟到greyPal調色盤 3.修改調色盤陣列 4.SetPaletteEntries重設hande的調色盤 5.tmpBmp->Palette = hPal;重設tmpBmp的調色盤 補:因為只針對調色盤修改,對實際的資料仍然必須參考greyPal[index]取得gray |
encoref70036
一般會員 發表:29 回覆:47 積分:15 註冊:2011-05-18 發送簡訊給我 |
所以GetPaletteEntries(hPal, 0, 256, greyPal)然後把取得的顏色hPal丟給greyPal陣列
GetPaletteEntries(Image1->Picture->Bitmap->Palette, 0, 256, greyPal) SetPaletteEntries(Image1->Picture->Bitmap->Palette, 0, 256, greyPal) Image1上面不是有圖片嗎 為什麼不行呢?
編輯記錄
|
senso
高階會員 發表:5 回覆:126 積分:226 註冊:2003-11-27 發送簡訊給我 |
|
encoref70036
一般會員 發表:29 回覆:47 積分:15 註冊:2011-05-18 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |