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

想取出圖片的某部份出來做影像處理

尚未結案
akin1107
一般會員


發表:12
回覆:14
積分:5
註冊:2004-07-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-30 17:05:08 IP:220.130.xxx.xxx 未訂閱
我有一張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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-30 18:05:43 IP:211.76.xxx.xxx 未訂閱
akin1107 您好:    您的起始值似乎並正確。    
引言:
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開始 程式就可以進行的很順利 想請問一下到底是哪裡有問題呢?
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
akin1107
一般會員


發表:12
回覆:14
積分:5
註冊:2004-07-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-01 00:05:56 IP:220.130.xxx.xxx 未訂閱
我回去改了您紅色的那些字後,發覺還是不行耶 我原本是將全圖轉為01存成文字檔 所以文字檔會以01呈現全圖的樣子 但是現再我只想取井字的中間那部份 也希望存到文字檔後還是能看出以01表現的中間部分影像 我改過以後  發現文字檔還是產生我原來沒改的那些問題 可以麻煩再幫我解答一下嗎..   感激不盡
richtop
資深會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-01 00:48:40 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-03 22:43:02 IP:220.130.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-04 00:00:31 IP:211.76.xxx.xxx 未訂閱
引言: 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就是您要的結果。 請參考!
系統時間:2024-05-21 4:01:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!