《在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息讲诉.》由会员分享,可在线阅读,更多相关《在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息讲诉.(12页珍藏版)》请在金锄头文库上搜索。
1、在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息,在静态图片中我们很方便可以使用文字或者其他小图标形式进行标注!但也造成了所标注的点只能是静态显示而已,现在我们的需求是,一张背景图,上面有一些点需要标注,这些点需要可以移动 鼠标进入区域可以提示或高亮 背景图分辨率变化时 这些点能自动计算相对位置及大小使重叠在背景中当然还有很多其他用处,如联动操作!下面就已我实际中遇到的问题来做演示:先看2张图进行一下对比图一:从这张图可以看出 当鼠标移入此区域时 会将此区域高亮并TollTip下(演示图做的有点粗糙 大家见谅)图二:这张是鼠标移出后的图,大家可以看到几乎是完全重叠看不出 (上
2、图高亮区域为一个自定义控件), 当然仔细看下 其实重合的并不是完美, 下面我会讲一个办法来做到看不出粗糙OK,看完这2张演示草图后,我先来描述下如何实现这样的功能,其实也很简单1: 在背景图需要显示的区域截图该区域图, 要计算此截取区域相对与原图的 top,left,windth,height比例 (注意 需要计算出比例 以便在程序中档背景图分辨率变量时根据比例重新计算区域图的大小及位置)2:将截取的区域图不需要高亮的部分处理为透明,这一步为下一步制作部规则自定义控件做准备3:制作一个区域图为背景的不规则自定义控件,4,:将自定义控件添加到显示原背景图的容器中;如下演示剩下部分就是自定义控件根
3、据背景进行位置及大小的计算了,先贴一部分用到的代码,与制作不规则控件相关 publicstaticRegionInitCreate(Bitmapbitmap)if(bitmap=null)/由窗口最小化引发自定义控件的背景图为null控件大小为0returnnull;intheight=bitmap.Height;intwidth=bitmap.Width;intxStart,xEnd;GraphicsPathgrpPath=newGraphicsPath();for(inty=0;yheight;y+)/逐行扫描;for(intx=0;xwidth;x+)/略过连续透明的部分;while(x
4、width&bitmap.GetPixel(x,y).A=10)x+;/不透明部分;xStart=x;while(x10)x+;xEnd=x;if(bitmap.GetPixel(x-1,y).A=10)grpPath.AddRectangle(newRectangle(xStart,y,xEnd-xStart,1);returnnewRegion(grpPath);制作的不规则控件为了减少刷新,需要设置为双缓冲,(但是不知道是双缓冲原因还是windows机制问题,窗体最小化时会致使自定义控件背景图为null 大小为0,但窗口恢复后又正常,望知道的朋友不惜赐教)图像缩放 /Resize图片/原
5、始Bitmap/新的宽度/新的高度/保留着,暂时未用/处理以后的图片publicstaticBitmapKiResizeImage(Bitmapbmp,intnewW,intnewH,intMode)tryBitmapb=newBitmap(newW,newH);Graphicsg=Graphics.FromImage(b);/插值算法的质量g.InterpolationMode=InterpolationMode.HighQualityBicubic;g.DrawImage(bmp,newRectangle(0,0,newW,newH),newRectangle(0,0,bmp.Width,
6、bmp.Height),GraphicsUnit.Pixel);g.Dispose();returnb;catchreturnnull;图像亮度调整 /图像明暗调整/原始图/亮度-255,255/publicstaticBitmapKiLighten(Bitmapb,intdegree)if(b=null)returnnull;if(degree255)degree=255;tryintwidth=b.Width;intheight=b.Height;intpix=0;Rectanglerect=newRectangle(0,0,width,height);System.Drawing.Ima
7、ging.BitmapDatabmpData=b.LockBits(rect,System.Drawing.Imaging.ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);IntPtrptr=bmpData.Scan0;intbytes=bmpData.Stride*height;bytergbValues=newbytebytes;System.Runtime.InteropServices.Marshal.Copy(ptr,rgbValues,0,bytes);intoffset=bmpData.Stride-width*3;intk=0;for(inty=0;yheight;y+)for(intx=0;xwidth;x+)/if(b.GetPixel(x,y)=Color.Transparent)/不处理透明部分/continue;/处理指定位置像素的亮度for(inti=0;i3;i+)pix=rgbValuesk+i+degree;if(degree0)rgbValuesk+i=(byte)Math.Min(255,pix);k+=3;k+=offset;System.Runtime.InteropServices.Marshal.Copy(rgbValues,0,ptr,bytes);b.Un