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

改變灰階像素值

尚未結案
larry701130
一般會員


發表:5
回覆:0
積分:1
註冊:2003-09-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-21 00:29:51 IP:218.167.xxx.xxx 未訂閱
Graphics::TBitmap *TheBitmap, *TempBitmap; int Width, Height; Byte *ptr1, *ptr2; TempBitmap= new Graphics::TBitmap(); TheBitmap= Image1->Picture->Bitmap; TempBitmap->Assign(TheBitmap); Width= TheBitmap->Width; Height= TheBitmap->Height; for(int x=0;x< Width; x ) for(int y=0;y< Height;y ) TempBitmap->Canvas->Pixels[x][y]=RGB()<----- TheBitmap->Assign(TempBitmap); delete TempBitmap; 想問問如果我只想去做灰階的像素改變~也就是只有八位元~那就不能使用 pixels[][]這個屬性了嗎???? 如果可以的話,pixels[][]=(這邊應該要怎填才行??不是不能填int嗎?) 因為正在處理灰階圖案
Cooky Kid
初階會員


發表:5
回覆:68
積分:44
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-21 01:05:58 IP:211.76.xxx.xxx 未訂閱
看看這個範例能否給您一些幫助? enjoy it!!!! 直接更改這圖像的色盤較快....
//---------------------------------------------------------------------------
//從彩色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;
}
//---------------------------------------------------------------------------
人生就像是盒中的巧克力,除非你試了,要不然,你永遠都不知道它是什麼樣的口味。--阿甘正傳
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-14 22:25:18 IP:211.76.xxx.xxx 未訂閱
larry701130您好:    精確的說:灰階的像素其實仍是彩色的像素,只是其中的RGB分量均相同罷了。 所以您的問題似乎變成:當您確定某一像素的灰階值(gray)時,如何將這樣的值透過 Canvas->Pixels[x][y]的指定,來將影像秀出來。    建議關於顏色的相關資料,可參考BCB的help檔中的TColor type。    BCB中顏色是enum型態,簡單格式說明:0x00BBGGRR => 32 bits的整數    為安全起見可以先設定一個無號整數變數,    unsigned int color=0; .....    gray = gray & 0xff;  // 確保其值在0~255之間 color = (gray<<16) | (gray<<8) | gray; // '|'(or)改成' '(相加)也行 TempBitmap->Canvas->Pixels[x][y] = color // 進步就是解決之前存在的問題!
系統時間:2024-05-15 4:49:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!