有一个Image画着“1”,“2”...“9”十个电话号码,如何区分我鼠标点击了哪个号码(1-9)?

zzyyjj 2003-11-28 09:53:52
如何把这样image的九个部分分割、区分,
并且鼠标能识别点击哪个部分?
...全文
50 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bkoklam 2004-03-07
  • 打赏
  • 举报
回复
大家来看看我的问题吧 http://expert.csdn.net/Expert/TopicView1.asp?id=2812723
sun_wyz 2004-03-07
  • 打赏
  • 举报
回复
坐标判断很容易的
eccalc 2004-03-07
  • 打赏
  • 举报
回复
这个问题有如下两个方案:
一、从创建图形开始跟踪:例如你在Image 画上了1234,Canvas->TextOutA(LeftX,TopY,
"1234");记录你的LeftX,TopY值,这个一般是用数据库的:
建立如下表:#SystemID #LeftX #TopY #NumberText
在鼠标移动时跟踪扫描LeftX,TopY值,如果落入它的区域,例如矩形区域,圆形,或者其他组合的区域,TRect(LeftX,TopY,LeftX+RectWidth,TopY+RectHeight),为了提高速度,
一般用SQL查询得到 函数框架:
AnsiString __fastcall MouseIn(TPoint NowPt)
{
//向QueryX中传入NowPt参数。
//遍历坐标表,这个要注意图形重合或者部分重合判断,因此需要增加一个
//表来记录图形画法的顺序,一般是从最上层优先选择,即返回SelText;
return SelText;
}
这个办法适用自己定义或者几何图形的判断,但是它一般不支持撤销功能!
二、同时在区域判断上还可以使用Windows API 来判断,函数原型是:
BOOL PtInRect(

CONST RECT *lprc, // address of structure with rectangle
POINT pt // structure with point
);

这个函数在生成了区域时是不容易的,它的原理和N个点画一个闭合区域差不多!
为了得到它,我们往往要处理掩图技术,这个在动画程序里很常见(处理速度不佳),如果没有必要,不建议使用这个方法。
但是,我们在处理或者说识别复杂的图形时是很有用的,打个比方:在你的Image上是有一副背景图,上面存在12,33,4553等数字.这个时候,你可以加入在数据库中定位了你的
12,33,4553等数字的区域后,将他们从Image上复制到内存中,然后开始象素识别,
这时,你就需要再建立一张数据表,用来描述12,33,4553等数字他们的特征图形,
识别步骤:
1、数字的是RGB一定范围区间。
2、判断如果让他放大后(先逐步放大你的标准数据表中的数字图形),将它们对比。
3、在第二步中你写入如下判断:将图形旋转识别。
识别结束后,同时记录边缘点数组,生成一个区域。下来就如上面的API搞定它了!
这个方法复杂,实现起来很麻烦的,但是它支持从外部导入的图形,很像图形处理软件的抠图功能!
现在很多图形识别软件的识别优先级别是从特征下手的,例如汉字识别。
理由:1、加快识别速度。
2、允许识别错误,这个问题是从商业角度出发的,例如1/1000的出错率,产品就可以发布。
12点了,我要睡觉了!(写的很乱!)
chifengwatch 2004-03-07
  • 打赏
  • 举报
回复
up
hed 2004-03-06
  • 打赏
  • 举报
回复
我敢说一句楼主对图画(特别是GIS)了解的非常少!
此方问题请与he-d@netease.com联系,免费解答!
  • 打赏
  • 举报
回复
“楼主估计是想做车牌识别 相类似的 工作吧。
嘿嘿—— 这个是一个很前卫的技术, 有相关的技术出售,偶也只懂一点点”
是不是汉王识别技术一类的,图象识别数字,OCR影象识别系统什么的。这就可以直接买汉王的DLL了。
lijia8407 2003-12-04
  • 打赏
  • 举报
回复
还是识别坐标吧,不过比较麻烦

void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
Refresh();
Canvas->TextOutA(10,10,IntToStr(X)+" and " + IntToStr(Y)); //测试坐标
if(X>=0 && Y<=30 && Y>=0 && Y<=30) //确认点击 1
......
}
当然,这要很确定每个数字的坐标
我的新手,程序写得都很差,请见谅
goneaway1981 2003-12-03
  • 打赏
  • 举报
回复
刚才好象说的不对
应该把商赋给I,J
然后I-1+J当做SWICH 语句的参数。
goneaway1981 2003-12-03
  • 打赏
  • 举报
回复
可以设一个常量I、J,
然后将图片放在左上角坐标为(11,11)、(11,22)、(11,33)、(22,11)、(22,22)、(22,33)。。。。。。(33,33)的区域,并且边长为10。
然后判断鼠标的横纵坐标,X/10,Y/10,将得到的余数付给I,J.
再用一个swich语句,给每种情况添加事件就可以了。

办法比较麻烦,但应该可以实现。
crzman37 2003-12-03
  • 打赏
  • 举报
回复
POINT pd;
GetCursorPos(&pd);
先用坐标记每个数据的坐标范围,如果鼠标的位置在这个范围内就可以知道数字了
tokens 2003-12-03
  • 打赏
  • 举报
回复
用热点。
zhang21cnboy 2003-12-03
  • 打赏
  • 举报
回复
既然电话号码是画上去的,就一定知道个号码的位置区域。利用鼠标点击事件获取坐标,结合Image的Top及Left,可以判断出是否有某一号码被点击。


这种方式肯定不行。。。。图片是没有坐标的。。。。。所以叫做栅格。。。

aliker(吹口琴的猫) 的方法好想不满足人家的需要哦,人家的那些数字在一张图片里面。。。
yjy1001 2003-12-03
  • 打赏
  • 举报
回复
"如果图是固定的,那就判断坐标!
否则,(如是32位彩色图),那就告诉你,不可能!"

这个 说法 肯定是错误的。

楼主估计是想做车牌识别 相类似的 工作吧。
嘿嘿—— 这个是一个很前卫的技术, 有相关的技术出售,偶也只懂一点点

这个是一个值钱的技术,在这里肯定求不到

你搜一下 “识别” 关键词 ,可以搜集到很多相关的讨论 —— 但都没有解决方法(有用钱买的解决方法)

答案是 肯定可以区分出来。
constantine 2003-12-02
  • 打赏
  • 举报
回复
你太有创意了,何必这样呢?
  • 打赏
  • 举报
回复
同意 吹口琴的猫 的方法。
gk0205 2003-12-02
  • 打赏
  • 举报
回复
tag~
aliker 2003-12-02
  • 打赏
  • 举报
回复
//假设图片是如下排列的(如果图片排列没有规律,那就没有办法了)
//1 2 3
//4 5 6
//7 8 9
const TILEWIDTH=12;//假设9个图片,每个图片高宽都为12
const TILEHEIGHT=12;
int N;//N代表你点了哪个数字
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
int iX=X/TILEWIDTH; //换算成第几列 //用X=13,Y=13试试,应该为(1,1)
int iY=Y/TILEHEIGHT; //换算成第几行
N=(iY*3+iX)+1;//因为不是从0开始,而是从1开始(1-9);
ShowMessage("你点击了数字"+IntToStr(N));
}
如果Image控件没有这个方法,那么就用TPaintBox.
chenqm 2003-12-02
  • 打赏
  • 举报
回复
既然电话号码是画上去的,就一定知道个号码的位置区域。利用鼠标点击事件获取坐标,结合Image的Top及Left,可以判断出是否有某一号码被点击。
zhang21cnboy 2003-12-02
  • 打赏
  • 举报
回复
呵呵,办法肯定有了,不过恐怕比较难。。。

在gis里面这叫做栅格地图哦。。。。。。

可以分析出那些数字的
nobill 2003-12-02
  • 打赏
  • 举报
回复
放10个按纽或放10个Image
加载更多回复(6)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧