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

下载本文档

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

文档简介

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

2、域为一个自定义控件),当然仔细看下 其实重合的并不是完美,F面我会讲一个办法来做到看不岀粗糙OK,看完这2张演示草图后,我先来描述下如何实现这样的功能,其实也很简单1 :在背景图需要显示的区域截图该区域图,要计算此截取区域相对与原图的to p,left,wi ndth,height比例(注意需要计算岀比例 以便在程序中档背景图分辨率变量时根据比例重新计算区域图的大 小及位置)2 :将截取的区域图不需要高亮的部分处理为透明,这一步为下一步制作部规则自定义控件做准3 :制作一个区域图为背景的不规则自定义控件,4,:将自定义控件添加到显示原背景图的容器中;如下演示_ /.l/70他血如Grap hi

3、cs Path grpP ath =new Grap hics Path。;剩下部分就是自定义控件根据背景进行位置及大小的计算了,先贴一部分用到的代码,EH与制作不规则控件相关P ublicstaticRegi on In itCreate(Bitma p bitma p)if(bitma p =null )/由窗口最小化引发自定义控件的背景图为null控件大小为0intreturn nullheight = bitma p. Height;intwidth = bitma p. Width;intxStart, xEnd;for(int y =0; y height; y+)/逐行扫描;fo

4、r(int x =0; x width; x+)/略过连续透明的部分;while (x width & bitma p.Get Pixel(x, y).A =10 )X+;/不透明部分;xStart = X;10)while (X x+;xEnd = x;if (bitma p.Get Pi xel(x -1, y).A =10 )grpP ath.AddRecta ngle( new Recta ngle(xStart, y, xEnd - xStart,1);returnnew Regi on(grpP ath);制作的不规则控件为了减少刷新,需要设置为双缓冲,(但是不知道是双缓冲原因还是

5、win dows 机制问题,窗体最小化时会致使自定义控件背景图为null大小为0,但窗口恢复后又正常,望知道的朋友不惜赐教)/IIIResize 图片/原始 Bitmap /新的宽度/新的高度 /保留着,暂时未用 /处理以后的图片 Bitma p KiResizelmage(Bitma p bmp.p ublic staticint n ewW, int newH,int Mode)tryBitma p b =new Bitma p(n ewW, n ewH);Grap hics g = Gra phics.Fromlmage(b);/ 插值算法的质量g.I nter polatio nM o

6、de = In terpolatio nM ode.HighQualityBicubic;g.DrawImage(b mp,new Recta ngle(0, 0, newW, newH),new Recta ngle( 0,0, bmp. Width, bmp .Height), Grap hicsU nit .P ixel);g.Dis pose();return b;catchreturn null/ /图像明暗调整/原始图 /亮度-255, 255/p ublicstaticBitma p KiLighte n( Bitma p b,int degree)if(b =null )ret

7、urnnullif(degree 255 ) degree =255 ;tryintwidth = b.Width;intheight = b.Height;intpix =0;Recta ngle rect =new Recta ngle( 0,0, width, height);System.Drawi ng.lmagi ng.Bitma pData bmp Data =b.LockBits(rect, System.Drawi ng.lmagi ng.lmageLockMode.ReadWrite,PixelFormat.Format24b pp Rgb);IntP tr ptr = b

8、mp Data.Sca nO;int bytes = bmp Data.Stride * height;byte rgbValues =new byte bytes;System.Ru ntime .In tero pServices.Marshal.C opy(p tr, rgbValues, 0, bytes);intoffset = bmp Data.Stride - width *3;intk =0;for(int y =0; y height; y+)for (int x =0; x width; x+)/if (b.Get Pixel(x, y) = Color.Tra nspar

9、ent) /不处理透明部分/c on ti nue;/处理指定位置像素的亮度for (int i =0; i 3; i+)pix = rgbValuesk + i + degree;if (degree 0) rgbValuesk + i=(byte )Math.Min( 255 , pix);k +=3;k += offset;System.Ru ntime.l ntero pServices.Marshal.C op y(rgbValues, 0, ptr, bytes);b.U nlockBits(b mp Data);/*原unsafe代码改由上面代码执行,无需使用指针un safeb

10、yte* p = (byte*)data.Sca nO;int offset = data.Stride - width * 3;for (i nt y = 0; y height; y+)for (i nt x = 0; x width; x+)/处理指定位置像素的亮度(0, pix);(255, pix);for (i nt i = 0; i 3; i+)pix = p i + degree;if (degree 0) pi = (byte)Math.Min / i / xP += 3; /指针地址改变P += offset; /指针地址改变 / yb.U nlockBits(data);

11、 */returnb;catchreturnnull/ end of Lighte n上面是与图像操作相关的代码,都参考自网络,只是将亮度调整的代码中un safe部分修改了下,0 0自定义控件相对大小及位置计算/*控件图相对于背景图的坐标及大小*/double x =381 / 963f, y =87/ 585f, w =179 / 963f, h =112 / 585f;/*重置控件*/publicvoid ReSize( int width,int height)this.Top = ( int )(height * y);/根据比例计算控件相对位置this.Left =(int )(w

12、idth * x);int w1 = ( int )(width * w);/根据相对比例计算控件缩放int h1 = ( int )(height * h);0); /Bitmap bmp = IMGUI.KiResizelmage(backlmg, w1,h1.原图缩放/n ew_backImg = IMGUI.KiResizeImage (n ew_backlmg, w1, h 1, 0);if (bmp!= null ) /此处会由窗口最小化产生bmp为空异常,可以构造函数用单独字段来保存原始 backImg ,此演示不再修改n ew_backImg = IMGUI.KiLighte

13、n(new Bitma p(bmp).100); /亮度图缩放这里注意原图的亮度变量也要随原图缩放变化重新计算this.Backgrou ndlmage = bmp;this.Width = w1;this.Height = h1;Region = IMGUI.I ni tCreate(bm p);/重新设置控件形状自定义控件操作的这部分代码就不用说了,下面是整个demo项目,有兴趣的可以看看!/Files/cxwx/Co ntrolDemo.rar(需要用到的图片在 debug目录下)OK ,这样一个大概的实现就完成了,但是实际我们发现由于区域截图与背景图的相对比例都产生控件与背景无法完美重

14、叠(可能会差1-2像素),还有一些不正确的处理导致的其他问题, 如 不规则窗体计算算法的不合理可能导致遍历图片时间过长F面我在给岀一个比较巧妙的处理方法:1 :关于自定义控件不能与背景区域完美重叠(补充下:别忘了自定义控件要以背景图PictureBox为父控件哦,原因自己想去吧哈哈)将自定义控件设置为背景透明,-根据区域切图计算不规则窗体- 计算岀不规则窗体的亮度图- 将控件背景图置 NULL呵呵,不知道大家想到没,由于自定义控件背景为透明,形状却是区域部分的不规则状,所以实际上我们看不到自定义控件,只有当鼠标移入区域时,由于设置控件背景图为亮度图,所以会显示岀入第一幅图的效果来,当鼠标移岀后还原为空相关代码如:/*控件背景图亮度变化相关*/s e)privatevoidUserCo ntrol1_MouseE nter(objectsen der, Eve ntArgtip .SetToolT ip(this ,测试一哈“);this.Backgrou ndlmage = n ew_backlmg;/设置控件背景为亮度图s e)privatevoid UserC on trol1_MouseLeave(objectsen der, Eve ntArgthis.Backgrou ndlmage = b

温馨提示

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

评论

0/150

提交评论