版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国热带农业科学院湛江实验站2026年第一批公开招聘工作人员备考题库完整答案详解
- 2026年安徽水利水电职业技术学院单招职业技能笔试备考试题及答案解析
- 2026年黄淮学院招聘高层次人才备考题库完整参考答案详解
- 初中数学解题策略数字教育资源开发与教学创新教学研究课题报告
- 2026年鄂尔多斯市万里路桥集团招聘备考题库完整答案详解
- 2026年普陀区教育系统公开招聘391名教师备考题库及答案详解1套
- 2026年中国人民大学党委保卫部(处)招聘备考题库及答案详解参考
- 2025年非遗木雕非遗非遗市场消费行为报告
- 湛江开发区科技创业服务中心公开招募2026年第一批次科技型企业(项目)的备考题库及参考答案详解一套
- 2026年新安中学(集团)龙田学校招聘若干名购买服务教师备考题库附答案详解
- 2025贵州锦麟化工有限责任公司第三次招聘7人备考笔试题库及答案解析
- 2025广东广州琶洲街道招聘雇员(协管员)5人笔试考试参考试题及答案解析
- 2025国家统计局齐齐哈尔调查队招聘公益性岗位5人笔试考试备考试题及答案解析
- 2025年特种作业人员危险化学品安全作业(化工自动化控制仪表)考试题库及答案
- 2026四川成都高新投资集团有限公司第一批校园招聘35人笔试考试备考试题及答案解析
- 人社局公益性岗位笔试题目及答案
- 2025年华住集团酒店考试题库
- 《建设工程施工合同示范文本》(GF-2022-0201) 核心条款与使用指南
- 媒人介绍相亲协议书
- 2025年超星尔雅学习通《数据分析与统计》考试备考题库及答案解析
- 2025纪检监察应知应会试题库与参考答案
评论
0/150
提交评论