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

關於繪出封閉區域後填色

答題得分者是:richtop
adward
一般會員


發表:24
回覆:19
積分:8
註冊:2004-09-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-07 19:42:39 IP:61.31.xxx.xxx 未訂閱
請問各位前輩 我構想在一張圖上畫出一些封閉的區域 然後將這些封閉的區域內填上顏色 目前繪圖已經沒有問題 但是在構想填色時,覺得很困惑 不知道該用什麼方法達到填滿顏色的目的 請各位前輩給點想法....感謝囉....
rogan321
高階會員


發表:21
回覆:307
積分:200
註冊:2003-05-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-07 19:58:15 IP:203.204.xxx.xxx 未訂閱
加上這行~決定填滿Canvas的顏色~ 例~紅色 Canvas->Brush->Color=clRed;
adward
一般會員


發表:24
回覆:19
積分:8
註冊:2004-09-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-08 00:49:04 IP:211.76.xxx.xxx 未訂閱
你誤會我的意思了... 我只是想要把我所畫出來的封閉區域中... 填上顏色... 而在那些區域之外不會有改變... 不知道有沒有什麼較適合的方法...或是想法...
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-08 01:31:36 IP:210.192.xxx.xxx 未訂閱
下面這篇文章有您要的答案以及程式碼 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=59806 我是新手 多多指教 ^^ 發表人 - 1666362 於 2004/12/08 01:33:00
adward
一般會員


發表:24
回覆:19
積分:8
註冊:2004-09-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-08 14:22:46 IP:61.30.xxx.xxx 未訂閱
謝謝大大的回應 這個方法其實我之前也有想過... 不過由於我的圖上不只有一個封閉的區域... 所以好像沒有辦法直接用邊界去做... 所以還在思考要怎樣做... 這是我的影像...想要在那些區域填上顏色...
richtop
資深會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-08 16:06:56 IP:211.76.xxx.xxx 未訂閱
adward 您好:    關於您所謂的填色需求不知是人為手動或由程式自行判斷?    1) 人為操作 您可利用滑鼠點選區域內部,

//---------------------------------------------------------------------------    void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  Image1->Picture->Bitmap->Canvas->Brush->Color = clBlue;
  Image1->Picture->Bitmap->Canvas->FloodFill(X,Y,clBlack,fsBorder);
}
//--------------------------------------------------------------------------- 
2) 程式自動執行 這裡提供一個"偷吃步"的方法: 前提是您的圖形必須是二值化的圖(轉成Bitmap格式),或者說是僅有兩個顏色;還有假設圖形四個角落至少有一個不在封閉區域內部。 通常判斷上比較麻煩的是:封閉區域內外是一樣的顏色,只有區域邊界是另一種顏色。 所以我用了個耍賴的方法: 先將區域外塗成第三種顏色,於是這時只有白色是區域內部,因此當掃描到白色點時,就可以利用FloodFill(.)填滿該封閉區域;完成全圖掃描後,再將區域外部填成白色即可。 至於如果想要填入不同的顏色,就請自行思考修改一下囉! < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=19139650&CC=428050">

void scan2D(TImage *image, TColor fillColor)
{ Byte **ptr;
  int r, g, b, index;      image->Picture->Bitmap->PixelFormat = pf24bit;
  // 視覺上維持白色感覺
  image->Picture->Bitmap->Canvas->Brush->Color = (TColor)RGB(252,253,254);
  image->Picture->Bitmap->Canvas->FloodFill(0,0,clBlack,fsBorder);      ptr = new Byte*[image->Picture->Height];
  for (int k=0; kPicture->Height; k++)
     ptr[k] = (Byte*) image->Picture->Bitmap->ScanLine[k];      for (int row=0; rowPicture->Height; row++)
     { index = 0;
       for (int col=0; colPicture->Width; col++)
          { b = ptr[row][index  ];
            g = ptr[row][index+1];
            r = ptr[row][index+2];                if ( r==255 && g==255 && b==255 ) // come into the internal of closed regions
              { image->Picture->Bitmap->Canvas->Brush->Color = fillColor;
                image->Picture->Bitmap->Canvas->FloodFill(col,row,clBlack,fsBorder);
              }
            index += 3;
          }
     }
  // 還原封閉區域外部回白色
  image->Picture->Bitmap->Canvas->Brush->Color = clWhite;
  image->Picture->Bitmap->Canvas->FloodFill(0,0,clBlack,fsBorder);      delete [] ptr; // 釋放記憶體
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button2Click(TObject *Sender)
{
  scan2D(Image1, RGB(255,0,0));
}
//--------------------------------------------------------------------------- 
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2004/12/08 16:15:37
rogan321
高階會員


發表:21
回覆:307
積分:200
註冊:2003-05-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-08 16:43:59 IP:203.204.xxx.xxx 未訂閱
你好~我剛試了一下Canvas可以達到你要的要求阿~不知道你是用什麼畫多邊形    
wen142
一般會員


發表:22
回覆:27
積分:14
註冊:2004-06-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-14 12:41:29 IP:140.135.xxx.xxx 未訂閱
rogan321大大您好 因為adward希望的是 由程式判斷自動貼附上顏色 所以richtop的想法比較接近 另外您畫的W 形狀 正是他擔心在測邊的過程中 會造成程式判斷錯誤的狀況 所以我認為richtop"偷吃步"的方法 很有創意也應該是可以是是看的方式 bcb新手上路 請多指教
系統時間:2024-05-12 11:47:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!