全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1798
推到 Plurk!
推到 Facebook!

我想將512*512圖片的像素放入二維陣列中,請各位大大、高手們幫我看看程式哪裡有問題,謝謝!!

答題得分者是:poaivy
fly093218
一般會員


發表:8
回覆:7
積分:3
註冊:2008-11-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-25 12:07:31 IP:118.160.xxx.xxx 訂閱
以下為我所寫的程式:
void __fastcall TForm1::Thresholding1Click(TObject *Sender)
{
Graphics::TBitmap *TheBitmap, *TempBitmap;
int Width,Height;
Byte *ptr1,*ptr2;
TempBitmap=new Graphics::TBitmap();
TheBitmap=Image1->Picture->Bitmap;
TempBitmap->Assign(TheBitmap);
TheBitmap->PixelFormat=pf8bit;
Width=TheBitmap->Width;
Height=TheBitmap->Height;
for(int y=0;y for(int x=0;x a[x][y]=TheBitmap->Canvas->Pixels[x][y];
}
}
}
執行後輸出:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit2->Text=a[2][2];
Edit3->Text=a[200][200];
}
我有上傳程式檔案,麻煩各位大大及高手,小弟剛學bcb沒多久,請大家幫忙,謝謝!!
感謝大大的解答,但又出現新問題囉,我發現之前的程式是正確的但輸出的pixel值超大
用滑鼠所顯示的RGB值為162,但pixel的值卻為10658466
相差太多了,不知道是哪裡出問題了
------
jason
附加檔案:492b7a035780c_應用.rar
編輯記錄
fly093218 重新編輯於 2008-11-25 23:26:30, 註解 還是有問題‧
change5945
一般會員


發表:2
回覆:3
積分:1
註冊:2007-12-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-25 15:04:36 IP:203.64.xxx.xxx 訂閱
你的圖案也是灰階8bit的圖
所以基本上RGB三個值會相等
且~像素值會等同於(R B G)/3
所以我寫的程式是直接取R值來做運算

大概PO一些程式碼給你看一下~希望能幫到你

void __fastcall TForm1::Button6Click(TObject *Sender)
{
Graphics::TBitmap *TheBitmap;
Byte *ptr;
int r;
int orgimg[512][512]
PALETTEENTRY pal[1];
TheBitmap=Image1->Picture->Bitmap;
if(!Image1->Picture->Bitmap->Empty)
{
for(int y=0;yHeight;y )
{ ptr=(Byte*)TheBitmap->ScanLine[y];
for(int x=0;xWidth;x )
{
GetPaletteEntries(TheBitmap->Palette,ptr[x],1,pal);
r=pal[0].peRed;
orgimg[x][y]=r;
//StringGrid1->Cells[X 1][Y 1]=IntToStr(tempC[X][Y]);
orgimage->Cells[x 1][y 1]=IntToStr(orgimg[x][y]);
}
}
}

以上是我的程式~我也不確定可否這樣寫~
希望可以幫到你囉~因為我也是在做這方面的程式
fly093218
一般會員


發表:8
回覆:7
積分:3
註冊:2008-11-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-25 23:13:40 IP:118.160.xxx.xxx 訂閱
感謝大大的解答,但又出現新問題囉,我發現之前的程式是正確的但輸出的pixel值超大
用滑鼠所顯示的RGB值為162,但pixel的值卻為10658466
相差太多了,不知道是哪裡出問題了
------
jason
poaivy
中階會員


發表:40
回覆:78
積分:53
註冊:2004-08-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-26 10:00:49 IP:140.117.xxx.xxx 訂閱
仔細去看依下Canvas->Pixels 的說明吧~^^
裡面會說的很清楚
If you specify TColor as a specific 4-byte hexadecimal number instead of using the constants defined in the Graphics unit, the low three bytes represent RGB color intensities for blue, green, and red, respectively. The value 0x00FF0000 represents full-intensity, pure blue, 0x0000FF00 is pure green, and 0x000000FF is pure red. 0x00000000 is black and 0x00FFFFFF is white.
Pixels 是TColor type
32BIT的資料
包含了RGB各8BIT也就是說 你將10658466 << 16
就會等於162了


===================引 用 fly093218 文 章===================
以下為我所寫的程式:
void __fastcall TForm1::Thresholding1Click(TObject *Sender)
{
Graphics::TBitmap *TheBitmap, *TempBitmap;
int Width,Height;
Byte *ptr1,*ptr2;
TempBitmap=new Graphics::TBitmap();
TheBitmap=Image1->Picture->Bitmap;
TempBitmap->Assign(TheBitmap);
TheBitmap->PixelFormat=pf8bit;
Width=TheBitmap->Width;
Height=TheBitmap->Height;
for(int y=0;y for(int x=0;x a[x][y]=TheBitmap->Canvas->Pixels[x][y];
}
}
}
執行後輸出:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit2->Text=a[2][2];
Edit3->Text=a[200][200];
}
我有上傳程式檔案,麻煩各位大大及高手,小弟剛學bcb沒多久,請大家幫忙,謝謝!!
感謝大大的解答,但又出現新問題囉,我發現之前的程式是正確的但輸出的pixel值超大
用滑鼠所顯示的RGB值為162,但pixel的值卻為10658466
相差太多了,不知道是哪裡出問題了
fly093218
一般會員


發表:8
回覆:7
積分:3
註冊:2008-11-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-26 11:42:12 IP:118.160.xxx.xxx 訂閱
感謝poaivy大大的提示,我終於成功哩!!
我的方法是這樣:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int y=0;y<=511;y ){
for(int x=0;x<=511;x ){
b[x][y]=((a[x][y])>>16);
}
}
Edit2->Text=b[2][2];
Edit3->Text=b[200][200];
}
不過跟大大說的不ㄧ樣,我用的是>>16
非常感謝您喔!!
------
jason
系統時間:2024-05-07 17:47:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!