編寫了一個提取圖片中路徑座標的工具----初學VC++2005

最近本民工忙於編寫“祖瑪”的遊戲,由於遊戲開發中需要描繪小球滾動的路徑,特此編寫該工具,用來提取BMP圖片中黑點所描繪路徑的座標點。

原本打算用MFC來寫,由於俺初學這方面的知識,加上需求時間緊迫,所以暫用C++/CLI開發,因爲原先有用C#開發過其他的工具,上手會快一些。

呵呵,下面就說說這個簡單的“提取圖片中路徑座標的工具”吧。

圖中是一條用黑色( R:0, G:0, B:0 )點描繪的路徑,起點在左下角,點紅色(R:255, G:0, B:0 )像素,終點在右上角,點蘭色( R:0, G:0, B:255 )像素。

見放大圖:

紅色的起點

  藍色的終點

點擊“轉換保存”,起點和終點的座標被提取至對話框,同時另存爲 *.txt 的文檔,生成從起點至終點的系列座標。

見下圖:

{ 0 ( 序號 ) , 0 ( X座標 ) , 185 (Y座標) }  ,以上123.txt只是部分截圖。

-------------------------以下介紹製作流程----------------------------

1.查找紅色和蘭色的像素點
  1.1 定義 Bitmap^ CLRWimage;
  1.2 逐點掃描提取逐點的像素  pixelColor = CLRWimage->GetPixel( x, y );
  1.3 判斷是否爲紅色或者蘭色,如果是該顏色,退出掃描,提取座標。(是在起點和終點分別爲一個的情況下)

 Bitmap^ CLRWimage;
private: System::Void ResearchRedPix(int &x, int &y)
 
{
     Color pixelColor;
     
for(y = 0; y < 240; y++)
     
{
         
for(x = 0; x < 320; x++)
         
{
             pixelColor 
= CLRWimage->GetPixel( x, y );
             
if(( pixelColor.R == 255 )&&( pixelColor.B == 0 )&&( pixelColor.G == 0 ))
                 
break;
         }

             
if(( pixelColor.R == 255 )&&( pixelColor.B == 0 )&&( pixelColor.G == 0 ))
                     
break;
     }

         txtBeginX
->Text = Convert::ToString(x);
         txtBeginY
->Text = Convert::ToString(y);
 }

以上是提取紅色點的部分代碼,圖片大小爲320×240像素。

 2.搜索路徑
  2.1 把紅色的起點記錄在數組中,記錄爲當前點
  2.2 掃描當前點周圍的8個點判斷是否爲蘭色的終點,如果是蘭色的終點就退出,不是蘭色就繼續2.3步驟
  2.3 掃描當前點周圍的8個點判斷是否爲黑色的終點,如果是黑色的點,繼續2.4步驟;如果不是黑色的點,繼續2.3的步驟,直到8個點掃描結束沒有發現,就退出。
  2.4 把該點設置爲當前點,並且記錄到數組中。繼續2.2步驟。
  (由於代碼冗繁,不貼上來了,見結尾處的資源下載鏈接)

3.保存文件
呵呵,這裏的步驟就不說明了,看下面代碼。

System::IO::Stream^ myStream;
SaveFileDialog
^ saveFileDialog1 = gcnew SaveFileDialog;
saveFileDialog1
->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
saveFileDialog1
->FilterIndex = 1;
saveFileDialog1
->RestoreDirectory = true;

 
if ( saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
 
{
     
if ( (myStream = saveFileDialog1->OpenFile()) != nullptr )
     
{
         
// Code to write the stream goes here.
         StreamWriter^ sw = gcnew StreamWriter(myStream);
         sw
->Write("{");
         
for(int i = 0 ; i <= ordinal_num; i++ )
         
{
             sw
->Write("" + Convert::ToString(RouteXY_array[i][0]) + "" + Convert::ToString(RouteXY_array[i][1]) + "" + Convert::ToString(RouteXY_array[i][2]) + " }, " );
             
if( i % 4 == 3 )
             
{
                 sw
->WriteLine();
             }

         }

         sw
->Write("}");
         sw
->WriteLine("//====================" + "總共有" + Convert::ToString(ordinal_num) + "個像素" + "==================");
         sw
->Close();
     }

 }

以上爲此軟件工具的大概製作流程。

詳細部分見資源下載:http://d.download.csdn.net/down/416552/samulelin

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章