想取出圖片的某部份出來做影像處理 |
尚未結案
|
akin1107
一般會員 發表:12 回覆:14 積分:5 註冊:2004-07-26 發送簡訊給我 |
我有一張235*350的圖
我想擷取圖中假設等分為九格後的中間部分
以下是我部分的程式碼
void __fastcall Tfrmimage::botlpixelClick(TObject *Sender) { 取像素&存成文字檔 Memo2->Lines->Clear(); AnsiString filename; Byte *ptr; int w, h, index; AnsiString line; w = Image1->Picture->Bitmap->Width; h = Image1->Picture->Bitmap->Height; line.SetLength(w); // start from 1 Memo2->Font->Size = 1; Image1->Picture->Bitmap->PixelFormat = pf24bit; for (int y=117; y<234; y ) { ptr = (unsigned char *) Image1->Picture->Bitmap->ScanLine[y]; index = 0; for (int x=79; x<157; x ) { if ( ptr[index]==255) { line[x 1] = '1'; } else { line[x 1] = '0'; } index = 3; } Memo2->Lines->Add(line); } Memo2->Lines->SaveToFile(filename ".txt");上述的程式跑出來並不是我想要的結果 不知道是不是line.SetLength(w); // start from 1 這一行的關係 但是將它刪除成也無法跑 若不將它刪除,更改X的範圍 設為0開始 程式就可以進行的很順利 想請問一下到底是哪裡有問題呢? |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
akin1107 您好: 您的起始值似乎並正確。
引言:RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####void __fastcall Tfrmimage::botlpixelClick(TObject *Sender) { 取像素&存成文字檔 Memo2->Lines->Clear(); AnsiString filename; Byte *ptr; int w, h, index; AnsiString line; w = Image1->Picture->Bitmap->Width; h = Image1->Picture->Bitmap->Height; line.SetLength(w); // start from 1 Memo2->Font->Size = 1; Image1->Picture->Bitmap->PixelFormat = pf24bit; for (int y=117; y<234; y ) { ptr = (unsigned char *) Image1->Picture->Bitmap->ScanLine[y]; index = 3*79; // not 0; for (int x=79; x<157; x ) { if ( ptr[index]==255) { line[x 1] = '1'; } else { line[x 1] = '0'; } index = 3; } Memo2->Lines->Add(line); } Memo2->Lines->SaveToFile(filename ".txt");上述的程式跑出來並不是我想要的結果 不知道是不是line.SetLength(w); // start from 1 這一行的關係 但是將它刪除成也無法跑 若不將它刪除,更改X的範圍 設為0開始 程式就可以進行的很順利 想請問一下到底是哪裡有問題呢? |
akin1107
一般會員 發表:12 回覆:14 積分:5 註冊:2004-07-26 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
akin1107 您好: 不好意思,之前沒有完全看完您的程式。
除了紅色的是部份外,我發現造成錯誤的原因可能還有:
雖然幫line設定長度,不過這時line的內容似乎沒有初始化,因此好像會造成加入Memo或RichEdit時造成錯誤。
所以我試著幫填滿空格,測試之後發現可行,您參考測試看看。
line.SetLength(w); // start from 1 AnsiString format; format.printf("%%%ds",w); line.printf(format.c_str()," ");RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
akin1107
一般會員 發表:12 回覆:14 積分:5 註冊:2004-07-26 發送簡訊給我 |
richtop大哥您好
謝謝您回答我的問題,但是還有個小問題想請教您
程式碼在按照你的方式改了之後的確能跑了
但是我希望能消除文字檔左邊的那些空白
因為我之後會將文字檔的內容傳到陣列
不知道那些空白會不會造成影響
還有能麻煩你解釋一下上次你寫的程式碼的意思嗎,加註解就好了
line.SetLength(w); // start from 1
AnsiString format;
format.printf("%%%ds",w);
line.printf(format.c_str()," ");
謝謝您的幫助
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
引言: richtop大哥您好 謝謝您回答我的問題,但是還有個小問題想請教您 程式碼在按照你的方式改了之後的確能跑了 但是我希望能消除文字檔左邊的那些空白 因為我之後會將文字檔的內容傳到陣列 不知道那些空白會不會造成影響 還有能麻煩你解釋一下上次你寫的程式碼的意思嗎,加註解就好了 line.SetLength(w); // 設定字串的長度與影像寬度相同 AnsiString format; format.printf("%%%ds",w); //要將line全部填滿空格,但是不同的影像其寬度也不同,所以用這個方法隨輸入影像的寬度來調整空格的長度。 line.printf(format.c_str()," "); //將format由AnsiString轉為char陣列 //例如:w=20,format=" s" 謝謝您的幫助要將line左邊空格移去,可利用AnsiString的成員函式:Trim(), TrimRight(), or TrimLeft()。 AnsiString msg; msg = line.Trim(); 或者利用 msg = line.SubString(80,line.Length()-80); // 數字80是您問題中的數據 此時的msg就是您要的結果。 請參考! > |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |