您的位置:首页 > 编程语言 > C语言/C++

编写了一个提取图片中路径坐标的工具----初学VC++2005

2008-04-16 11:52 585 查看
最近本民工忙于编写“祖玛”的游戏,由于游戏开发中需要描绘小球滚动的路径,特此编写该工具,用来提取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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: