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

調色盤?

答題得分者是:senso
encoref70036
一般會員


發表:29
回覆:47
積分:15
註冊:2011-05-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-07-28 23:16:42 IP:111.253.xxx.xxx 訂閱
你好~
我在版上看到一個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;
}
//---------------------------------------------------------------------------
請問粗體字那邊 為什麼要建一個hpal?hpal是一個調色盤嗎? 還有GetPaletteEntriesSetPaletteEntries怎麼用呢?
麻煩大俠了~
感恩
編輯記錄
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-07-29 10:52:40 IP:61.219.xxx.xxx 訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-07-29 19:26:43 IP:111.253.xxx.xxx 訂閱
所以HPALETTE hPal = tmpBmp->ReleasePalette();是把分離出來的顏色給hPal
GetPaletteEntries(hPal, 0, 256, greyPal)然後把取得的顏色hPal丟給greyPal陣列
SetPaletteEntries(hPal, 0, 256, greyPal)然後再把修改過的greyPal丟回給hPal
這樣對嗎?
可是這樣寫好像不行耶
GetPaletteEntries(Image1->Picture->Bitmap->Palette, 0, 256, greyPal)
SetPaletteEntries(Image1->Picture->Bitmap->Palette, 0, 256, greyPal)

Image1上面不是有圖片嗎 為什麼不行呢?

編輯記錄
encoref70036 重新編輯於 2011-07-29 07:07:34, 註解 無‧
encoref70036 重新編輯於 2011-08-06 09:45:46, 註解 無‧
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-07-29 21:11:32 IP:114.42.xxx.xxx 訂閱
先tmpBmp->ReleasePalette();
在tmpBmp->Palette = hPal;

下面這樣不行...
SetPaletteEntries(tmpBmp->Palette, 0, 256, greyPal)
//property Palette: HPALETTE read GetPalette write SetPalette;
trace一下都只有跑read GetPalette
encoref70036
一般會員


發表:29
回覆:47
積分:15
註冊:2011-05-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-07-29 21:57:19 IP:111.253.xxx.xxx 訂閱
謝謝您
系統時間:2017-10-18 15:32:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!