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

24bit灰階圖轉8bit灰階圖

尚未結案
overgod
一般會員


發表:5
回覆:5
積分:2
註冊:2004-12-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-30 18:20:59 IP:61.31.xxx.xxx 未訂閱
小弟在將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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-31 20:40:50 IP:221.169.xxx.xxx 未訂閱
ptr8[i] = (int)((ptr24[i*3] ptr24[i*3 1] ptr24[i*3 2])/3 ); 改成 ptr8[i] = (((int)ptr24[i*3] ptr24[i*3 1] ptr24[i*3 2])/3 ); 看看 裡面三個相加的元素都是Byte型態,最多255,有可能導致overflow
系統時間:2024-05-20 22:14:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!