在工程軟件中會遇到在一張工程圖紙或背景圖中標注一些標志或者其他信息_第1頁
在工程軟件中會遇到在一張工程圖紙或背景圖中標注一些標志或者其他信息_第2頁
在工程軟件中會遇到在一張工程圖紙或背景圖中標注一些標志或者其他信息_第3頁
在工程軟件中會遇到在一張工程圖紙或背景圖中標注一些標志或者其他信息_第4頁
在工程軟件中會遇到在一張工程圖紙或背景圖中標注一些標志或者其他信息_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論