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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个web图片热点生成工具(winform开发) 附源码相关的知识,希望对你有一定的参考价值。

给图片加热点是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

以上是关于一个web图片热点生成工具(winform开发) 附源码的主要内容,如果未能解决你的问题,请参考以下文章

代码生成工具更新--快速生成Winform框架的界面项目

一个非常好用的图片切割工具(c# winform开发) 附源码

Winform实现将网页生成图片的方法

图片抓取器web + winform

C# winform开发中用picturebox 只能显示大图片一部分,如何生成适合picturebox的图片并且保证不失真?有知

webform和winform共用一个文件夹