




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、在工程軟件中會遇到在一張工程圖紙或背景圖中標注一些標志或者其他信息,在靜態(tài)圖片中我們很方便可以使用文字或者其他小圖標形式進行標注!但也造成了所標注的點只能是靜態(tài)顯示而已,現(xiàn)在我們的需求是,一張背景圖,上面有一些點需要標注,這些點需要可以移動 鼠標進入?yún)^(qū)域可以提示或高亮 背景圖分辨率變化時 這些點能自動計算相對位置及大小使重疊在背景中當然還有很多其他用處,如聯(lián)動操作! 下面就已我實際中遇到的問題來做演示:先看2張圖進行一下對比圖一: 從這張圖可以看出 當鼠標移入此區(qū)域時 會將此區(qū)域高亮并TollTip下(演示圖做的有點粗糙 大家見諒) 圖二:這張是鼠標移出后的圖,大
2、家可以看到幾乎是完全重疊看不出 (上圖高亮區(qū)域為一個自定義控件), 當然仔細看下 其實重合的并不是完美, 下面我會講一個辦法來做到看不出粗糙 OK,看完這2張演示草圖后,我先來描述下如何實現(xiàn)這樣的功能,其實也很簡單1: 在背景圖需要顯示的區(qū)域截圖該區(qū)域圖, 要計算此截取區(qū)域相對與原圖的 top,left,windth,height比例 (注意 需要計算出比例 以便在程序中檔背景圖分辨率變量時根據(jù)比例重新計算區(qū)域圖的大小及位置)2:將截取的區(qū)域圖不需要高亮的部分處理為透明,這一步為下一步制作部規(guī)則自定義控件做準備3:制作一個區(qū)域圖為背景的不規(guī)則自定義控件,4,
3、:將自定義控件添加到顯示原背景圖的容器中;如下演示 剩下部分就是自定義控件根據(jù)背景進行位置及大小的計算了,先貼一部分用到的代碼,與制作不規(guī)則控件相關 public static Region InitCreate(Bitmap bitmap) if (bitmap =
4、 null) /由窗口最小化引發(fā)自定義控件的背景圖為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; /略過連續(xù)透明的部分; 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); 制作的不規(guī)則控件為了減少刷新,需要設置為雙緩沖,(但是不知道是雙緩沖原因還是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;代碼改由上面代碼執(zhí)行,無需使用指針 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 上面是與圖像操作相關的代碼,都參考自網(wǎng)絡,只是將亮度調整的代碼中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); /根據(jù)比例計算控件相對位置 this.Left&
66、#160;= (int)(width * x); int w1 = (int)(width * w); /根據(jù)相對比例計算控件縮放 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為空異常,可以構造函數(shù)用單獨字段來保存原始backImg,此演示不再修改 new_backImg = IMGUI.KiLighten(new Bitmap(bmp), 100); /亮度圖縮放 ,這里注意原圖的亮度變量也要隨原圖縮放變化重新計算 this.BackgroundIma
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 購物中心品牌傳播的多元化途徑探索
- 金融風險下的財務分析與報表解讀策略
- 柳州專版2025版中考歷史奪分復習第03部分八上第24課人民解放戰(zhàn)爭的勝利實戰(zhàn)演練
- 北京專版2024年中考生物復習專項訓練五生物的生殖發(fā)育和遺傳變異
- 高中語文情感美文至愛無言
- 高質量醫(yī)療的秘訣規(guī)范的血液透析流程
- 跨文化背景下跨境電商平臺用戶體驗優(yōu)化策略
- 初中語文生活美文生活如歌
- 湖南2025年02月湖南省新邵縣教育局選調2名工作人員筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 購物中心的娛樂設施對消費者體驗的影響
- Unit 2 Bridging Cultures Reading for writing 課件-高中英語(2019)選擇性必修第二冊
- 2024年全國統(tǒng)一高考數(shù)學試卷(新高考Ⅰ)含答案
- GB/T 18876.1-2024應用自動圖像分析測定鋼和其他金屬中金相組織、夾雜物含量和級別的標準試驗方法第1部分:鋼和其他金屬中夾雜物或第二相組織含量的圖像分析與體視學測定
- 2024年河南省高考對口升學語文試卷及參考答案
- 司索工安全技術交底
- 解析:2023年廣西壯族自治區(qū)中考數(shù)學真題(原卷版)
- 爬模施工應急處置措施
- 2024年越南高純碳化硅粉末行業(yè)現(xiàn)狀及前景分析2024-2030
- 領養(yǎng)小孩申請書
- GB 1588-2024醫(yī)用玻璃體溫計
- 全國大學生英語競賽輔導課件教學培訓課件
評論
0/150
提交評論