在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息_第1页
在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息_第2页
在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息_第3页
在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息_第4页
在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息,在静态图片中我们很方便可以使用文字或者其他小图标形式进行标注!但也造成了所标注的点只能是静态显示而已,现在我们的需求是,一张背景图,上面有一些点需要标注,这些点需要可以移动 鼠标进入区域可以提示或高亮 背景图分辨率变化时 这些点能自动计算相对位置及大小使重叠在背景中当然还有很多其他用处,如联动操作! 下面就已我实际中遇到的问题来做演示:先看2张图进行一下对比图一: 从这张图可以看出 当鼠标移入此区域时 会将此区域高亮并TollTip下(演示图做的有点粗糙 大家见谅) 图二:这张是鼠标移出后的图,大

2、家可以看到几乎是完全重叠看不出 (上图高亮区域为一个自定义控件), 当然仔细看下 其实重合的并不是完美, 下面我会讲一个办法来做到看不出粗糙 OK,看完这2张演示草图后,我先来描述下如何实现这样的功能,其实也很简单1: 在背景图需要显示的区域截图该区域图, 要计算此截取区域相对与原图的 top,left,windth,height比例    (注意 需要计算出比例 以便在程序中档背景图分辨率变量时根据比例重新计算区域图的大小及位置)2:将截取的区域图不需要高亮的部分处理为透明,这一步为下一步制作部规则自定义控件做准备3:制作一个区域图为背景的不规则自定义控件,4,

3、:将自定义控件添加到显示原背景图的容器中;如下演示  剩下部分就是自定义控件根据背景进行位置及大小的计算了,先贴一部分用到的代码,与制作不规则控件相关  public static Region InitCreate(Bitmap bitmap)                    if (bitmap =

4、 null)   /由窗口最小化引发自定义控件的背景图为null 控件大小为0                return null;            int height = bitmap.Height; 

5、60;          int width = bitmap.Width;            int xStart, xEnd;            GraphicsPath grpPath&

6、#160;= new GraphicsPath();            for (int y = 0; y < height; y+)                   

7、0;        /逐行扫描;                for (int x = 0; x < width; x+)            

8、60;                       /略过连续透明的部分;                    while (x < 

9、;width && bitmap.GetPixel(x, y).A <= 10)                                     &#

10、160;      x+;                                        /不透明部分; 

11、0;                  xStart = x;                    while (x < width &&

12、; bitmap.GetPixel(x, y).A > 10)                                         

13、   x+;                                        xEnd = x;   &#

14、160;                if (bitmap.GetPixel(x - 1, y).A >= 10)                     

15、60;                      grpPath.AddRectangle(new Rectangle(xStart, y, xEnd - xStart, 1);            

16、;                                                return 

17、;new Region(grpPath);          制作的不规则控件为了减少刷新,需要设置为双缓冲,(但是不知道是双缓冲原因还是windows机制问题,窗体最小化时会致使自定义控件背景图为null 大小为0,但窗口恢复后又正常,望知道的朋友不惜赐教) 图像缩放         / <summary>     

18、0;  / Resize图片        / </summary>        / <param name="bmp">原始Bitmap</param>        / <param name="new

19、W">新的宽度</param>        / <param name="newH">新的高度</param>        / <param name="Mode">保留着,暂时未用</param>       

20、; / <returns>处理以后的图片</returns>        public static Bitmap KiResizeImage(Bitmap bmp, int newW, int newH, int Mode)            &#

21、160;       try                            Bitmap b = new Bitmap(newW, newH);    

22、            Graphics g = Graphics.FromImage(b);                / 插值算法的质量           &#

23、160;    g.InterpolationMode = InterpolationMode.HighQualityBicubic;                g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 

24、0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);                g.Dispose();                return b;   &#

25、160;                    catch                            ret

26、urn null;                     图像亮度调整 / <summary>        / 图像明暗调整        / </summary>

27、;        / <param name="b">原始图</param>        / <param name="degree">亮度-255, 255</param>        / <retu

28、rns></returns>        public static Bitmap KiLighten(Bitmap b, int degree)                    if (b = null

29、)                            return null;                   

30、     if (degree < -255) degree = -255;            if (degree > 255) degree = 255;           &#

31、160;try                            int width = b.Width;               

32、 int height = b.Height;                int pix = 0;                Rectangle rect = new

33、60;Rectangle(0, 0, width, height);                System.Drawing.Imaging.BitmapData bmpData =                 

34、   b.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,                    PixelFormat.Format24bppRgb);           

35、;     IntPtr ptr = bmpData.Scan0;                int bytes = bmpData.Stride * height;           

36、0;    byte rgbValues = new bytebytes;                System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);       

37、         int offset = bmpData.Stride - width * 3;                int k = 0;        &#

38、160;       for (int y = 0; y < height; y+)                              

39、      for (int x = 0; x < width; x+)                                

40、;           /if (b.GetPixel(x, y) = Color.Transparent) /不处理透明部分                          &

41、#160; /continue;                        / 处理指定位置像素的亮度                   

42、60;    for (int i = 0; i < 3; i+)                                  

43、                  pix = rgbValuesk + i + degree;                      

44、      if (degree < 0) rgbValuesk + i = (byte)Math.Max(0, pix);                          

45、0; if (degree > 0) rgbValuesk + i = (byte)Math.Min(255, pix);                               

46、                 k += 3;                              &

47、#160;         k += offset;                                System.Runtime.InteropServi

48、ces.Marshal.Copy(rgbValues, 0, ptr, bytes);                b.UnlockBits(bmpData);                /*   原unsafe&

49、#160;代码改由上面代码执行,无需使用指针                unsafe                             &#

50、160;      byte* p = (byte*)data.Scan0;                    int offset = data.Stride - width * 3;    &

51、#160;               for (int y = 0; y < height; y+)                      

52、;                      for (int x = 0; x < width; x+)               

53、0;                                    / 处理指定位置像素的亮度          

54、0;                 for (int i = 0; i < 3; i+)                     &

55、#160;                                      pix = pi + degree;     

56、;                           if (degree < 0) pi = (byte)Math.Max(0, pix);         &

57、#160;                      if (degree > 0) pi = (byte)Math.Min(255, pix);             &

58、#160;               / i                            p += 3;  

59、/指针地址改变                         / x                      

60、60; p += offset; /指针地址改变                     / y                    &#

61、160;           b.UnlockBits(data); */                return b;               

62、60;        catch                            return null;          

63、;           / end of Lighten 上面是与图像操作相关的代码,都参考自网络,只是将亮度调整的代码中unsafe部分修改了下, 自定义控件相对大小及位置计算  /*控件图相对于背景图的坐标及大小*/        double x = 381 / 963f, y

64、60;= 87 / 585f, w = 179 / 963f, h = 112 / 585f;                /*重置控件*/        public void ReSize(int

65、0;width, int height)                    this.Top = (int)(height * y); /根据比例计算控件相对位置            this.Left&

66、#160;= (int)(width * x);            int w1 = (int)(width * w);  /根据相对比例计算控件缩放            int h1 = (int)(height 

67、;* h);            Bitmap bmp = IMGUI.KiResizeImage(backImg, w1,h1, 0);  /原图缩放            /new_backImg = IMGUI.KiResizeImage(new_ba

68、ckImg, w1, h1, 0);              if(bmp!=null) /此处会由窗口最小化产生bmp为空异常,可以构造函数用单独字段来保存原始backImg,此演示不再修改               new_backImg = IMGUI.KiLighten(new Bitmap(bmp), 100); /亮度图缩放   ,这里注意原图的亮度变量也要随原图缩放变化重新计算            this.BackgroundIma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论