给图片加热点是web开发中经常用到的一个功能。这方面的工具也不少。

为了更好的满足自己的需求,写了一个winform程序。

可以方便的给图片加热点,更方便灵活!

源码下载 http://download.csdn.net/download/qq_29939347/10150681

生成的代码:

1 <img src = "D:\12.jpg" usemap = "#Map_2017-12-08-10-49-17" >
2 <map name="Map_2017-12-08-10-49-17" >
3 <area shape="polygon" coords="144,229,228,198,266,152,305,181,319,247,405,288,396,324,353,348,340,381,307,391,278,395,280,422,291,427,279,444,284,453,264,461,225,444,187,452,133,465,102,454,90,459,55,459,50,432,17,412,15,395,0,373,11,372,13,310,45,320,83,311,122,301,136,278" href = "http://www.sina.com.cn/" >
4 <area shape="polygon" coords="784,426,768,475,787,491,815,491,833,475,854,452,863,435,881,418,903,396,867,390,855,408,842,416,830,401" href = "https://www.cnblogs.com/" >
5 <area shape="polygon" coords="39,474,322,474,322,663,39,663" href = "" >
6 <area shape="polygon" coords="427,322,567,341,623,322,673,295,681,275,672,257,698,248,746,227,803,173,770,154,721,165,732,126,766,99,768,48,759,22,779,12,786,39,806,49,824,55,844,50,855,87,857,99,821,154,842,181,831,198,889,260,845,301,817,321,740,318,722,348,676,389,655,413,640,433,591,422,589,472,543,432,550,400,505,417,467,382,435,370" href = "" >
7 </map>

技术要点

1 画图

热点图形有 矩形,多边形,圆形等。为了统一处理,定义了接口:

 1 interface IDrwaShap
 2     {
 3         void Draw(System.Drawing.Graphics g);
 4         string GetLink();
 5         bool Hit(int x, int y);
 6         bool IsChecked();
 7         void SetChecked(bool sel);
 8         void SetEndPoint(System.Drawing.Point end);
 9         void SetLink(string link);
10
11         void AddPoint(int x,int y);
12
13         void SetStartMovePoint(int x, int y);
14         void SetCurMovePoint(int x, int y);
15
16         int GetShapId();
17
18         List<Point> GetPoint();
19
20     }

矩形实现类为HotShapRect,多边形为HotShapPoly。

  1  class HotShapPoly : PicHot.IDrwaShap
  2     {
  3         static Pen _drawPen = new Pen(Color.Red, 2);
  4         static Pen _checkedPen = new Pen(Color.Blue, 2);
  5
  6         public int _shapId = 0;
  7         private bool _checked = false;
  8         private bool _startMove = false;
  9
 10         private Point _moveStartPoint = new Point(0, 0);
 11         string _linkText = string.Empty;
 12
 13         List<Point> _listPoint = new List<Point>();
 14         public HotShapPoly()
 15         {
 16             _shapId = AppNum.GetId();
 17         }
 18         public int GetShapId()
 19         {
 20             return _shapId;
 21         }
 22
 23         public List<Point> GetPoint()
 24         {
 25             return _listPoint;
 26         }
 27         public void AddPoint(int x, int y)
 28         {
 29             Point newPt = new Point(x,y);
 30             foreach (Point p in _listPoint)
 31             {
 32                 if (p == newPt)
 33                     return;
 34             }
 35
 36             _listPoint.Add(new Point(x, y));
 37         }
 38
 39         public void SetLink(string link)
 40         {
 41             _linkText = link;
 42         }
 43         public string GetLink()
 44         {
 45             return _linkText;
 46         }
 47         public void SetEndPoint(Point end)
 48         {
 49             AddPoint(end.X, end.Y);
 50         }
 51
 52         public void SetChecked(bool sel)
 53         {
 54             _checked = sel;
 55             _startMove = _checked;
 56         }
 57
 58         public bool IsChecked()
 59         {
 60             return _checked;
 61         }
 62
 63         public void SetStartMovePoint(int x, int y)
 64         {
 65             _moveStartPoint = new Point(x, y);
 66         }
 67         public void SetCurMovePoint(int x, int y)
 68         {
 69             if (!_startMove)
 70                 return;
 71
 72             Point moveEndPoint = new Point(x, y);
 73             List<Point> _listPointNew = new List<Point>();
 74             foreach (Point p in _listPoint)
 75             {
 76                int m =  p.X + (moveEndPoint.X - _moveStartPoint.X);
 77                int n =  p.Y + (moveEndPoint.Y - _moveStartPoint.Y);
 78                _listPointNew.Add(new Point(m,n));
 79             }
 80             _listPoint = _listPointNew;
 81
 82             _moveStartPoint = moveEndPoint;
 83         }
 84
 85
 86         public bool Hit(int x, int y)
 87         {
 88             if (_listPoint.Count <= 2)
 89                 return false;
 90
 91             Point hitPt = new Point(x,y);
 92
 93             GraphicsPath myGraphicsPath = new GraphicsPath();
 94             Region myRegion = new Region();
 95             myGraphicsPath.Reset();
 96
 97             Point[] points = _listPoint.ToArray();
 98             myGraphicsPath.AddPolygon(points);//points);
 99             myRegion.MakeEmpty();
100             myRegion.Union(myGraphicsPath);
101             //返回判断点是否在多边形里
102             bool myPoint = myRegion.IsVisible(hitPt);
103
104             return myPoint;
105         }
106
107         public void Draw(Graphics g)
108         {
109              if (_listPoint.Count <= 2)
110                 return ;
111
112             Pen pen = _checked ? _checkedPen : _drawPen;
113
114             g.DrawPolygon(pen, _listPoint.ToArray());
115         }
116
117         internal bool IsValidate()
118         {
119             if (_listPoint.Count <= 2)
120                 return false;
121             return true;
122         }
123
124     }

2 生成代码

 1  private void buttonCreateHtml_Click(object sender, EventArgs e)
 2         {
 3             StringBuilder sb = new StringBuilder();
 4
 5             string mapName = string.Format("Map_{0}", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss"));
 6             sb.AppendFormat("<img src = \"{0}\" usemap = \"#{1}\" >\r\n", fileName, mapName);
 7             sb.AppendFormat("<map name=\"{0}\" >\r\n", mapName);
 8             foreach (IDrwaShap shap in _shapGroup.Values)
 9             {
10                 sb.AppendFormat("<area shape=\"polygon\" coords=\"{0}\" href = \"{1}\" >\r\n",
11                     LinkPointToStr(shap.GetPoint()), shap.GetLink());
12             }
13             sb.Append("</map>");
14             Clipboard.SetText(sb.ToString());
15             textBoxHtml.Text = sb.ToString();
16
17             MessageBox.Show(this, "代码已复制到剪贴板!");
18         }

技术交流联系qq 13712486

转载于:https://www.cnblogs.com/yuanchenhui/p/web_hot_pic.html

一个web图片热点生成工具(winform开发) 附源码相关推荐

  1. 万圣节头像框生成工具微信小程序源码

    大家好万圣节马上就要来了 那么临近了万圣节那么也给大家带来了一款与万圣节相关的程序 那么这款程序呢就是可以制作生成与万圣节相关的头像框 内含多种模板风格可供选择 另外该款小程序是无需服务器和域名的 搭 ...

  2. 万圣节头像框生成工具微信小程序源码下载支持流量主收益模式

    大家好万圣节马上就要来了 那么临近了万圣节那么也给大家带来了一款与万圣节相关的程序 那么这款程序呢就是可以制作生成与万圣节相关的头像框 内含多种模板风格可供选择 支持用户上传模式和自动获取微信头像模式 ...

  3. 二维码生成工具微信小程序源码下载

    二维码生成工具 支持上传二维码logo和调整尺寸背景颜色等等 无需域名与服务器 使用教程,用HBuilder X软件打卡项目然后运行到微信小程序即可 下方是演示图: 小程序源码下载地址: (已更新)二 ...

  4. Selenium 凭什么成为 Web 自动化测试的首选?(内附源码)

    <自动化>工具 1.QTP QTP是一个商业化的功能测试工具,收费,支持web,桌面自动化测试. 2. Selenium(文章重点讲) Selenium是一个开源的web自动化测试工具,免 ...

  5. java计算机毕业设计web高校车辆调度系统设计与实现(附源码、数据库)

    java计算机毕业设计web高校车辆调度系统设计与实现(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...

  6. java计算机毕业设计web唐院寻人表白系统(附源码、数据库)

    java计算机毕业设计web唐院寻人表白系统(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclis ...

  7. java计算机毕业设计ssm基于web的教学资源管理系统01jkz(附源码、数据库)

    java计算机毕业设计ssm基于web的教学资源管理系统01jkz(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstor ...

  8. Java利用反射封装DBUtil,mysql万能增删改查工具类,附源码

    Java利用反射封装DBUtil,mysql万能增删改查工具类,附源码 等有时间再慢慢写代码注释吧,先把源码放出来.文章最后有整个项目的压缩包. ps:拓展 Java 原生MySQL JDBC 插入后 ...

  9. 安卓登录注册界面开发(附源码)

    源码下载和博客访问:安卓登录注册界面开发(附源码) 前言 最近找安卓登录注册界面,找了好久也没找到比较满意的设计,最后想想其实登录和注册两个界面也不复杂,干脆花点时间自己弄. 界面预览 最后的效果如下 ...

最新文章

  1. 华为MateRS巴黎大皇宫首秀 专为保时捷跑车70周年高定手机
  2. 远程访问mysql数据库_关于远程连接MySQL数据库的问题解决
  3. mongoose查询不到数据表中的数据的问题
  4. “羊贵妃”没走“牛魔王”又来?牛肉价格屡创新高
  5. springboot util 测试类怎么写_SpringBoot入门建站全系列(九)文件上传功能与下载方式...
  6. python可视化水平双向箭头_python数据可视化第二弹
  7. java面试题23 牛客ArrayLists和LinkedList的区别,下述说法正确的有?
  8. python flask服务器假死_python – Flask POST请求导致服务器崩溃
  9. android 生成签名和SHA1签名信息
  10. Android加密算法之AES加密和解密实现
  11. 19.Linux/Unix 系统编程手册(上) -- 监控文件事件
  12. Tomcat------如何配置域名和80端口
  13. 2021年中国液晶显示行业产业链分析:关键零部件国产化推进液晶显示行业发展 [图]
  14. 【已解决】【V2版本】如何使用脚本关闭Win10自动更新服务并阻止其自动启动?
  15. 六一儿童节(python)
  16. Win7 定时关机,重启命令
  17. 百度AI—人脸在线比对
  18. 一种Android应用耗电定位方案
  19. Python库中,如何使用jieba模块来实现古典名著《西游记》的分词
  20. Base64 编码原理及代码实现

热门文章

  1. 代码安全_弱点(脆弱性)分析 CWE_20200807
  2. Linux 更改主机的 host 名
  3. Linux 的 ps 命令 查看系统进程
  4. 【Kettle】Kitchen和Pan的命令行参数
  5. 【IDEA】关于 IDEA 中新建 web 项目的 webapp 文件夹没有小蓝点 ,启动服务,访问不到解决方案
  6. eclipse 中提示tomcat 的端口被占用了 后的最快捷解决方法
  7. Sonar问题及解决方案汇总
  8. 一个很小的图标需要另一个HTTP请求是不是很愚蠢? 如何将收藏夹图标放到精灵中?
  9. Jupyter Notebook中未显示Conda环境
  10. Bootstrap模态出现在背景下