最近本民工忙於編寫“祖瑪”的遊戲,由於遊戲開發中需要描繪小球滾動的路徑,特此編寫該工具,用來提取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 判斷是否爲紅色或者蘭色,如果是該顏色,退出掃描,提取座標。(是在起點和終點分別爲一個的情況下)
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.保存文件
呵呵,這裏的步驟就不說明了,看下面代碼。
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