编写了一个提取图片中路径坐标的工具----初学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
原本打算用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
相关文章推荐
- 一个提取软件图片资源的工具
- lmth1 一个用Python编写的便捷网页信息提取工具 - _Luc_ - 博客园
- lmth1 一个用Python编写的便捷网页信息提取工具
- 一个用来提取网页中图片的小工具
- lmth1 一个用Python编写的便捷网页信息提取工具 - _Luc_ - 博客园
- 键盘输入流,接收大文本数据,并输入一个图片路径,之后将这些数据保存在数据表中
- 创建一个简单的文本图片聊天工具
- 编写一个可配置的网页信息提取组件
- 用java编写的一个迪杰斯特拉算法(单源最短路径算法,Dijkstra算法)。
- 设计Point类用来定义平面上的一个点,用构造方法传 递坐标位置,方法有计算两点的距离。编写测试类,在该类中实现Point类的对象。
- 发布一个纯PHP的中文关键字自动提取工具
- 编写一个函数,它从一个字符串中提取一个子字符串
- 已知图片某区域内所有点坐标,求区域周长(非opencv轮廓提取)
- jquery动画 -- 2.元素坐标动画效果(创建一个图片走廊)
- android 点击一个按钮,选择一张图片,获取路径,然后显示在屏幕
- OpenGL织梦之旅【第三章】编写一个显示图片的程序
- 利用ROS工具从bag文件中提取图片
- 一个用文字组成图片的小工具
- RDLC 报表 引用外部图片 file用相对路径 开发工具vs2015
- 一个关于css中图片相对路径引用的示例