24bit灰階圖轉8bit灰階圖 |
尚未結案
|
overgod
一般會員 發表:5 回覆:5 積分:2 註冊:2004-12-30 發送簡訊給我 |
小弟在將24bit的灰階圖轉換成8bit的灰階圖的時候遇到了問題,
以下的方法皆是參考站上的前輩的方法,應該是沒有錯才是,
因為昨天已經試了一整天,仍然試不出來,所以特來求救。 連結1(擷取到的原圖):http://overgod.gotdns.com/image/test1.bmp
/////第一種方法////// Byte *ptr8;
Byte *ptr8;
Byte *ptr24; Byte grey;
int i,j; //-----建立灰階調色盤
LogPal SysPal;
SysPal.lPal.palVersion = 0x300;
SysPal.lPal.palNumEntries = 256;
for(int i=0;i<256;i )
{
SysPal.lPal.palPalEntry[i].peRed = (unsigned char)i;
SysPal.lPal.palPalEntry[i].peGreen = (unsigned char)i;
SysPal.lPal.palPalEntry[i].peBlue = (unsigned char)i;
SysPal.lPal.palPalEntry[i].peFlags = 0; // peFlags must set to 0
} ////////////////////////////////////////////////////////////////// Graphics::TBitmap *newbitmap24 = new Graphics::TBitmap();
newbitmap24->Assign(Image1->Picture->Bitmap);//把來源的圖指派給newbitmap24,來源的圖的pixelformat為pfDevice(回傳值為0) Graphics::TBitmap *newbitmap8 = new Graphics::TBitmap();//建立新的圖
newbitmap8->PixelFormat = pf8bit;
newbitmap8->Height = 480;
newbitmap8->Width = 640;
newbitmap8->Palette = CreatePalette(&SysPal.lPal);
//ShowMessage(newbitmap8->PixelFormat); for(j=0;j<480;j )
{
ptr24 = (Byte*)newbitmap24->ScanLine[j];
ptr8 = (Byte*)newbitmap8->ScanLine[j]; for(i=0;i<640;i )
{
ptr8[i] = (int)((ptr24[i*3] ptr24[i*3 1] ptr24[i*3 2])/3 );//連結2(方法一所得結果):http://overgod.gotdns.com/image/test2.bmp
}
}
Image2->Picture->Bitmap->Assign(newbitmap8);//將newbitmap8畫到另外一個圖面上
Image2->Repaint();
delete newbitmap8;
delete newbitmap24;
} //////第二種方法//////////////
Byte *ptr8;
Byte *ptr24;
Byte grey;
int i,j; //-----建立灰階調色盤
LogPal SysPal;
SysPal.lPal.palVersion = 0x300;
SysPal.lPal.palNumEntries = 256;
for(int i=0;i<256;i )
{
SysPal.lPal.palPalEntry[i].peRed = (unsigned char)i;
SysPal.lPal.palPalEntry[i].peGreen = (unsigned char)i;
SysPal.lPal.palPalEntry[i].peBlue = (unsigned char)i;
SysPal.lPal.palPalEntry[i].peFlags = 0; // peFlags must set to 0
} ////////////////////////////////////////////////////////////////// Graphics::TBitmap *newbitmap24 = new Graphics::TBitmap();
newbitmap24->Assign(Image1->Picture->Bitmap); Graphics::TBitmap *newbitmap8 = new Graphics::TBitmap();
newbitmap8->PixelFormat = pf8bit;
newbitmap8->Height = 480;
newbitmap8->Width = 640;
newbitmap8->Palette = CreatePalette(&SysPal.lPal);
//ShowMessage(newbitmap8->PixelFormat); for(j=0;j<480;j )
{ ptr8 = (Byte*)newbitmap8->ScanLine[j]; if(bCamera)// 這是使用某家產品的程式碼
{pPixValue=(unsigned char*)AxImageC241->GetSurfacePtr(0,j);} / /這是使用某家產品的程式碼
else
{pPixValue =(unsigned char*)AxAltair1->GetImagePtr(0,0,j);} //這是使用某家產品的程式碼 for(i=0;i<640;i )
{
B_PixValueArray[i][j]=*(pPixValue i*3); // 這是使用某家產品的程式碼,可以觀看到其值於新的表格上
G_PixValueArray[i][j]=*(pPixValue i*3 1);// 這是使用某家產品的程式碼,可以觀看到其值於新的表格上
R_PixValueArray[i][j]=*(pPixValue i*3 2);// 這是使用某家產品的程式碼,可以觀看到其值於新的表格上
grey =(B_PixValueArray[i][j] G_PixValueArray[i][j] R_PixValueArray[i][j])/3;
Gray[i][j] = grey; //我有另外產生一個新的表格(640*480)來看灰階值,其結果沒有錯。
ptr8[i] = (int)(Gray[i][j]);//把灰階值丟給ptr8----------所得結果請參考連結3:http://overgod.gotdns.com/image/test3.bmp
}
}
Image2->Picture->Bitmap->Assign(newbitmap8);
Image2->Repaint();
delete newbitmap8;
delete newbitmap24; 我真的找了很久,也試了很多的方法,實在是不行來才上來求救,論壇上的文章也都看過了!
希望大家可以指點一下,感激不盡。
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |