8bit調色盤的問題?? |
尚未結案
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
phorn 您好: 當改變Bitmap的PixelFormat屬性時,會導致Bitmap色彩變動。
不過不知道您所謂的影像會不一樣是什麼意思?
底下有個簡單的程式供您參考,試過後再來研究研究。 < href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=55450">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=55450 RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
phorn 您好: 我用您提供的圖形並沒有出現不同的現象。
修改部分程式碼,供您再試試,再不成功恐怕要看您的原始碼才能找出真正的因了。 部分程式碼修改如下: < class="code">//---------------------------------------------------------------------------
int extent=3; // default: pf24bit
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Image2->Picture->Bitmap->Width = Image1->Picture->Width;
Image2->Picture->Bitmap->Height = Image1->Picture->Height; Image2->Picture->Bitmap->Canvas->FillRect(Image2->ClientRect);
Image2->Picture->Bitmap->PixelFormat = Image1->Picture->Bitmap->PixelFormat; for (int y=0; y
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
richtop 您好: 不會吧!!< >我從六月就這樣了耶~~難道他們提早放假< >
我已經被這個問題搞的暈頭轉向了< >
我的電腦跟你一樣,我只有增加紅色部分時結果才會正常。
大大知道?什麼嗎< >
//--------------------------------------------------------------------------- int extent=4; // default: pf24bit void __fastcall TForm1::Button1Click(TObject *Sender) { Image2->Picture->Bitmap->Width = Image1->Picture->Width; Image2->Picture->Bitmap->Height = Image1->Picture->Height; Image2->Picture->Bitmap->Canvas->FillRect(Image2->ClientRect); Image2->Picture->Bitmap->PixelFormat = Image1->Picture->Bitmap->PixelFormat; Image2->Picture->Bitmap->Palette = Image1->Picture->Bitmap->Palette; for (int y=0; y |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
phorn 您好: 經過測試發現,我用的圖(包括從網頁上copy下您使用的圖(.bmp))都不是256色。於是我就改用Borland提供的256色圖檔,果然疑似的靈異現象出現了,但也有了較合理的解釋。
我參考TBitmap對Palette的說明,試驗發現在256色(含)以下時,調色盤才會被參考;而在更高顏色格式時,則直接引用pixel的內容轉換成該點的顏色,不需參考調色盤。
因此,由於之前我用的都不是256色圖檔,也就是說當我把Image1的pixels複製到Image2時,等於把所有的影像訊息完全傳了過去,這時候Image1與Image2的內容其實是一樣的,所以接下來即使我同時改變Image1與Image2的PixelFormat成pf8bit,使得它們會分別建立起屬於它們自己的調色盤,但由於兩者內容完全相同且建立調色盤的機制亦然,因此接下來它們"各自分別的變化"才會"看起來"都一樣!
參考Borland對TPixelFormat的定義:
enum TPixelFormat {pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom};
當圖檔顯示顏色數在256色(含)以下時,就必須設定Palette(調色盤) => PixelFormat <= 3,
否則就不必要設定Palette(調色盤) => PixelFormat > 3。 以上說明如果再輔以您所用的圖檔真的是256色的話,那問題就算是獲得解釋;否則.....?(您又說問題在六月就發生,...??...,那會不會是屈原?< >) 怎麼弄得好像柯南在推理案情一樣! 輕鬆一下,開開玩笑!< > 不過,我的測試可能不夠完整;如果有錯,也請自行測試與告知!謝謝啦! RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
richtop 您好: 經過您的的解釋小弟也測試了一下< >
結果發現< >載入PixelFormat > 3 的圖檔不會發現靈異現象是因為在
Image2->Picture->Bitmap->PixelFormat = pf8bit;
BCB自己將圖檔建立調色盤,由於他們的調色盤都是由BCB建立的關係,
所以結果不會有色彩不相同的狀況(調色盤相同)。
然而當載入PixelFormat <= 3 的圖檔時,由於我之前都是利用PhotoImpact 8 轉的8Bit 256色故其色盤與BCB色盤不相同,所以才會有靈異的現象發生。
這是小弟所做的小小推測< >
不知大大是否知道調色盤是一個怎麼樣的結構,如何建立< >
如何得知0~255各代表什麼樣的顏色,是如何去定義的< >
麻煩大大??我,謝謝!!< >
|
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
Dear phorn:
簡單的說,當Bitmap圖檔的顏色數在256以內,也就是每個像素以8bits(或更少)來表示時,就需要參考到調色盤(palette),才能正確顯示顏色。
在BCB的範例中,灰階調色盤的建立如下例:
// 定義調色盤結構 typedef struct { TLogPalette lpal; TPaletteEntry dummy[256]; } LogPal; // 建立灰階調色盤 LogPal GrayPalette; GrayPalette.lpal.palVersion = 0x300; GrayPalette.lpal.palNumEntries = 256; for(int Index = 0; Index < 256; Index ) { GrayPalette.lpal.palPalEntry[Index].peRed = (unsigned char)Index; GrayPalette.lpal.palPalEntry[Index].peGreen = (unsigned char)Index; GrayPalette.lpal.palPalEntry[Index].peBlue = (unsigned char)Index; GrayPalette.lpal.palPalEntry[Index].peFlags = (unsigned char)0; }建立完調色盤的內容,要產生給TBitmap的調色盤則用 Graphics::TBitmap *NewBMP = new Graphics::TBitmap(); NewBMP->PixelFormat = pf8bit; // 指定為 8bpp 的BMP NewBMP->Width = width; // 你的影像寬度 NewBMP->Height = height; // 你的影像高度 NewBMP->Palette = CreatePalette(&GrayPalette.lpal); // 建立灰階調色盤如果是8bits的彩色圖檔,不同索引值對應的顏色資訊就由上面的peRed、peGreen、peBlue來決定。CreatePalette()是Windows API,由調色盤資訊建立調色盤。 如果是讀入一張8bits的圖檔(到TImage1中),可以利用GetPaletteEntries()來取得調色盤中的顏色資訊。用法如下: PALETTEENTRY pe[256]; // 接收調色盤資訊的陣列 GetPaletteEntries( Image1->Picture->Bitmap->Palette, // handle of logical color palette 0, // first entry to retrieve 256, // number of entries to retrieve pe // address of array receiving entries );希望對你有幫助~^^ |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
phorn 您好: 誠如您所說的BCB的確像是會自動調整調色盤的樣子。
經查BCB help的TBitmap/Palette,有個範例您可試試。
有嘗試著修改,不過好像不太理我。
< class="code">//---------------------------------------------------------------------------
/* something cut from BCB6 onLine helper.
//...
typedef struct tagPALETTEENTRY { // TPaletteEntry
BYTE peRed;
BYTE peGreen;
BYTE peBlue;
BYTE peFlags;
} PALETTEENTRY, *PPALETTEENTRY, FAR *LPPALETTEENTRY; ///* Logical Palette * /
typedef struct tagLOGPALETTE { // TLogPalette
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[1];
} LOGPALETTE, *PLOGPALETTE, NEAR *NPLOGPALETTE, FAR *LPLOGPALETTE; ...
*/
[blue]
typedef struct {
TLogPalette lpal;
TPaletteEntry dummy[256];
} LogPal; void __fastcall TForm1::Button2Click(TObject *Sender)
{
TCanvas *tempCanvas = new TCanvas;
try
{
HWND notUsed;
tempCanvas->Handle = GetDeviceContext(notUsed);
TImage *image2save = new TImage(Form1);
try
{
image2save->Height = Height;
image2save->Width = Width;
TRect destRect = Rect(0,0,Width,Height);
TRect sourceRect = destRect;
image2save->Canvas->CopyRect(destRect, tempCanvas, sourceRect);
LogPal SysPal;
SysPal.lpal.palVersion = 0x300; SysPal.lpal.palNumEntries = 256;
GetSystemPaletteEntries(tempCanvas->Handle,0,256,SysPal.lpal.palPalEntry);
image2save->Picture->Bitmap->Palette = CreatePalette((const tagLOGPALETTE *)&SysPal.lpal);
image2save->Picture->Bitmap->PixelFormat = pf8bit; // Added by RichTop
image2save->Picture->SaveToFile("see.bmp");
}
__finally
{
delete image2save;
}
}
__finally
{
delete tempCanvas;
} }[blue] RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
TheMoon
中階會員 發表:17 回覆:95 積分:67 註冊:2002-06-05 發送簡訊給我 |
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
TheMoon
中階會員 發表:17 回覆:95 積分:67 註冊:2002-06-05 發送簡訊給我 |
你說的沒錯, 還是要建立一個Palette比較安全, 可以用GetPaletteEntries來複製調色盤, UINT GetPaletteEntries( HPALETTE hpal, // handle of logical color palette UINT iStartIndex, // first entry to retrieve UINT nEntries, // number of entries to retrieve LPPALETTEENTRY lppe // address of array receiving entries ); 複製的方式如下: LogPal Test; Test.lPal.palVersion=0x300; Test.lPal.palNumEntries=256; GetPaletteEntries(A->Palette,0,256,Test.lPal.palPalEntry); B->Palette=CreatePalette(&Test.lPal); 這樣應該就行了 > |
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
TheMoon
中階會員 發表:17 回覆:95 積分:67 註冊:2002-06-05 發送簡訊給我 |
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
TheMoon
中階會員 發表:17 回覆:95 積分:67 註冊:2002-06-05 發送簡訊給我 |
引言: TheMoon您好: PixelFormat = pf8bit 的圖檔它每一個點是用1個Byte儲存顏色深度(0~255) 0~255的顏色是由調色盤所設定 PixelFormat = pf4bit、PixelFormat = pf1bit 的圖檔照字面上來看,它每一個點應該是用4bit及1bit來儲存顏色深度, 分別為16色跟2色。 那請問這個說法對嗎 <><>>> 還是, > <><>>> 那他們的色盤又是怎麼配置ㄋ< > 想一次搞懂調色盤與 > 有勞大大囉< > <><>>> < href="http://www.awitness.org/delphi_pascal_tutorial/source3/palette_16_color.html">http://www.awitness.org/delphi_pascal_tutorial/source3/palette_16_color.html http://delphi.ktop.com.tw/topic.php?topic_id=31690發表人 - TheMoon 於 2004/09/02 18:34:00 |
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
TheMoon
中階會員 發表:17 回覆:95 積分:67 註冊:2002-06-05 發送簡訊給我 |
引言: TheMoon您好: 感謝您的答覆以及參考資料< > 那我測試了一下結果 > 但是量測出來的><>>> > 是調色盤定義不同所照成的嗎?< > <><> >> 還想請問大大一件事,就是一般 >可以自己設記憶體大小嗎< >謝謝!!< > <><> class="code"> PixelFormat是1bit的情形: //A是pf1bit的影像 //1 byte 有 8 pixel for(j=0;j發表人 - TheMoon 於 2004/09/03 14:49:23 發表人 - TheMoon 於 2004/09/03 14:51:01 |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
大家好: 有個很不錯的網站與程式,值得一遊與參考:
http://homepages.borland.com/efg2lab/ImageProcessing/ImageEnhancementUsingPalettes.htm RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
jou0117
一般會員 發表:0 回覆:1 積分:0 註冊:2007-02-14 發送簡訊給我 |
請問各位大大
這一段code如果要在visual studio C 寫的話,是要怎麼修改呢 // 定義調色盤結構 typedef struct { TLogPalette lpal; TPaletteEntry dummy[256]; } LogPal; // 建立灰階調色盤 LogPal GrayPalette; GrayPalette.lpal.palVersion = 0x300; GrayPalette.lpal.palNumEntries = 256; for(int Index = 0; Index < 256; Index ) { GrayPalette.lpal.palPalEntry[Index].peRed = (unsigned char)Index; GrayPalette.lpal.palPalEntry[Index].peGreen = (unsigned char)Index; GrayPalette.lpal.palPalEntry[Index].peBlue = (unsigned char)Index; GrayPalette.lpal.palPalEntry[Index].peFlags = (unsigned char)0; } 建立完調色盤的內容,要產生給TBitmap的調色盤則用 Graphics::TBitmap *NewBMP = new Graphics::TBitmap(); NewBMP->PixelFormat = pf8bit; // 指定為 8bpp 的BMP NewBMP->Width = width; // 你的影像寬度 NewBMP->Height = height; // 你的影像高度 NewBMP->Palette = CreatePalette(&GrayPalette.lpal); // 建立灰階調色盤 謝謝各位大大
------
Just do it |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |