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

下载本文档

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

文档简介

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

2、在背景图需要显示的区域截图该区域图,要计算此截取区域相对与原图的top,left,windth,height 比例(注意需要计算出比例以便在程序中档背景图分辨率变量时根据比例重新计算区域图的大小及位置)2:将截取的区域图不需要高亮的部分处理为透明,这一步为下一步制作部规则自定义控件做准备3:制作一个区域图为背景的不规则自定义控件,4,:将自定义控件添加到显示原背景图的容器中;如下演示deso剩下部分就是自定义控件根据背景进行位置及大小的计算了,先贴一部分用到的代码,国日与制作不规则控件相关public static region initcreate(bitmap bitmap)if (bit

3、map = null )l控件大小为0return null ;/由窗口最小化引发自定义控件的背景图为nulint height = bitmap.height;int width = bitmap.width;int xstart, xend;graphicspath grppath =new graphicspath();for ( int y =0; y height; y+)/逐行扫描; for (int x =0; x width; x+)10 )/略过连续透明的部分; while (x width & bitmap.getpixel(x, y).a = x+;/不透明部分;10)x

4、start = x; while (x x+; xend = x;if (bitmap.getpixel(x -1, y).a =10)grppath.addrectangle(new rectangle(xstart, y, xend - xstart,1); return new region(grppath);制作的不规则控件为了减少刷新,需要设置为双缓冲,(但是不知道是双缓冲原因还是windows 机制问题,窗体最小化时会致使自定义控件背景图为null大小为0,但窗口恢复后又正常,望知道的朋友不惜赐教)se图像缩放/ summary/ resize 图片/ /summary/param

5、name=bmp/paramname=neww/ returns public static t newh, int mode) 原始 bitmap /param新的宽度/param新的高度/param保留着,暂时未用/param处理以后的图片/returnsbitmap kiresizeimage(bitmap bmp,int neww,intrybitmap b =new bitmap(neww, newh);graphics g = graphics.fromlmage(b);/ 插值算法的质量g.interpolationmode = interpolationmode.highqua

6、litybicubic;neg.drawimage(bmp,new rectangle( 0, 0, neww, newh),w rectangle( 0, 0, bmp.width, bmp.height), graphicsunit.pixel);g.dispose();return b;catchreturn null ;ee图像亮度调整/ summary/ 图像明暗调整/ /summary/ param name=b 原始图 / param name=degree 亮度-255, 255 / returns/returnspublic static bitmap kilighten(b

7、itmap b,int degree)if (b = null )return null ;if (degree -255 ) degree = -255 ;if (degree 255 ) degree =255 ;tryint width = b.width;int height = b.height;int pix =0;rectangle rect =new rectangle( 0, 0, width, height);system.drawing.imaging.bitmapdata bmpdata =b.lockbits(rect, system.drawing.imaging.

8、imagelockmode.readwrite,pixelformat.format24bpprgb);intptr ptr = bmpdata.scan。;int bytes = bmpdata.stride * height;byte 口 rgbvalues = new byte bytes;system.runtime.interopservices.marshal.copy(ptr, rgbv alues, 0, bytes);int offset = bmpdata.stride - width *3;int k =0;for ( int y =0; y height; y+)for

9、 ( int x =0; x width; x+)/if (b.getpixel(x, y) = color.transparent) /不处理透明部分/continue;/处理指定位置像素的亮度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.runtime.interopservices.marshal.copy(rgbvalues, 0, ptr, bytes);b

10、.unlockbits(bmpdata);/* 原unsafe代码改由上面代码执行,无需使用指针unsafebyte* p = (byte*)data.scan0;int offset = data.stride - width * 3;for (int y = 0; y height; y+)for (int x = 0; x width; x+)/处理指定位置像素的亮度for (int i = 0; i 3; i+)pix = pi + degree;if (degree 0) pi = (byte)math.min(255, pix); / ip += 3; /指针地址改变/ xp +=

11、 offset; /指针地址改变 / yb.unlockbits(data); */ return b; catch return null ;/ end of lighten上面是与图像操作相关的代码,都参考自网络,只是将亮度调整的代码中unsafe部分修改了下,se自定义控件相对大小及位置计算/*控件图相对于背景图的坐标及大小*/double x =381 / 963f, y =87 / 585f, w =179 / 963f, h =112 / 585f;/*重置控件*/public void resize( int width, int height) this .top = ( in

12、t )(height * y);/根据比例计算控件相对位置this .left = ( int )(width * x);int w1 = ( int )(width * w);/根据相对比例计算控件缩放int h1 = ( int )(height * h);0);/bitmap bmp = imgui.kiresizeimage(backimg, w1,h1,原图缩放/new_backimg = imgui.kiresizeimage(new_backimg, w1, h 1, 0);if (bmp!= null ) /此处会由窗口最小化产生bmp为空异常,可以构造函数用单独字段来保存原始

13、 backimg ,此演示不再修改new_backimg = imgui.kilighten(new bitmap(bmp),100 );/亮度图缩放这里注意原图的亮度变量也要随原图缩放变化重新计算this.backgroundimage = bmp;this.width = w1;this.height = h1;region = imgui.initcreate(bmp);/重新设置控件形状自定义控件操作的这部分代码就不用说了,demo项目,有兴趣的可以看看!/files/cxwx/controldemo.rar(需要用到的图片在debug目录下)ok ,这样一个大概的实现就完成了,但是实

14、际我们发现由于区域截图与背景图的相对比例都是浮点型,而我们的控件大小位置都是int型产生控件与背景无法完美重叠(可能会差1-2像素),还有一些不正确的处理导致的其他问题,如 不规则窗体计算算法的不合理可能导致遍历图片时间过长下面我在给出一个比较巧妙的处理方法:1 :关于自定义控件不能与背景区域完美重叠(补充下:别忘了自定义控件要以背景图picturebox 为父控件哦,原因自己想去吧 哈哈 )将自定义控件设置为背景透明,- 根据区域切图计算不规则窗体- 计算出不规则窗体的亮度图- 将控件背景图置 null呵呵,不知道大家想到没,由于自定义控件背景为透明,形状却是区域部分的不规则状,所 以实际上

15、我们看不到自定义控件,只有当鼠标移入区域时,由于设置控件背景图为亮度图,所以会显示出入第一幅图的效果来,当鼠标移出后还原为空相关代码如:/*控件背景图亮度变化相关*/s e)亮度图s e)privatetip.settooltip(void usercontrol1_mouseenter(object sender, eventargthis ,测试一哈);this .backgroundimage = new_backimg;private void usercontrol1_mouseleave(this .backgroundimage = backimg;/设置控件背景为object sender, e

温馨提示

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

评论

0/150

提交评论