silverlight實現圖片局部放大效果

       silverlight實現圖片局部放大效果方法之一:express

能夠使用兩幅圖片,一幅圖片是顯示待放大的圖片,另外一幅圖片是原圖,這裏,他們固然須要知足原圖要大於帶放大的圖片的關係,這樣canvas

咱們經過模擬的放大鏡遮罩放到待放大圖片上,再根據原圖,使得局部放大並顯示。vim

具體的說,能夠設置一個Canvas對象,而後把一幅原圖放到裏面,接着使用clip屬性進行剪裁,你能夠這樣理解剪裁,在一塊布上,用剪刀減去一塊,或者剪出一個圓,咱們就用剪出一個圓爲例,在這個圓外面的部分都被剪去了,剩下的也就是咱們能看到的這個圓中的那部分圖片---也就是原圖的一部分。而後,咱們能夠根據你在待放大圖片上須要放大的部分,對原圖進行位置的改變,顯示出局部放大圖。app

       那麼怎麼樣來計算你須要放大的位置呢?ide

其實也很簡單,咱們能夠這麼想,在待放大圖片上,你作一個能夠隨鼠標拖動的放大鏡,而後,根據這個放大鏡的區域,在那個放原圖片的畫布對象的剪裁部分顯示出相應的那部分,由於原圖比待放大圖片要大,這樣天然就獲得了放大的效果。spa

如今剩下的問題就是怎麼要獲得他們對應的部分。在作這一步前,必需要明確一點,就是因此的東西都是按照比例放大的,因此,你那個放大鏡的長度和寬度與放大視窗(就是那個圓洞)的比例,應該與待放大圖片的長寬與原圖長寬的比例相等。接下來,就是要理解,怎麼樣獲得相應的位置了,能夠這麼想,在待放大圖片那邊,待放大的圖片是不動的,你動的是放大鏡,而在原圖那邊,那個放大視窗是不動的,你動的是原圖。這樣你根據相對運動,便知道,當你的放大鏡像左邊移動的時候,只要你的原圖向右邊移動就能夠在視窗看到你須要放大的那部分圖。由於咱們是用canvas進行絕對定位,因此,能夠獲得以下:code

            double n = img.Width / rect.Width;                                                 //原圖與待放大圖的比,也就是放大比例
            double left = (double)magnifiter.GetValue(Canvas.LeftProperty);        //獲得放大鏡的x座標
            double top = (double)magnifiter.GetValue(Canvas.TopProperty);       //獲得放大鏡的y座標
            double newleft = -n * left;                                                               //乘上比例係數並取負數(由於是相對運動)
            double newtop = -n * top;
            img.SetValue(Canvas.LeftProperty, newleft);                                       //設置原圖的位置
            img.SetValue(Canvas.TopProperty, newtop);orm

具體源代碼以下:xml

MainPage .xaml對象

 

代碼
 1  < UserControl  x:Class ="magnifier.MainPage"
 2      xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3      xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
 4      xmlns:d ="http://schemas.microsoft.com/expression/blend/2008"
 5      xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6      mc:Ignorable ="d"
 7      d:DesignHeight ="300"  d:DesignWidth ="400" >
 8 
 9       < Grid  x:Name ="LayoutRoot"  Background ="White" >
10 
11           < Canvas  x:Name ="mainback" >             
12             
13                   < Rectangle  Width ="260.5"  Height ="357.5"  x:Name ="rect" >
14                   < Rectangle.Fill >
15                       < ImageBrush  ImageSource ="a.jpg"  Stretch ="Fill" />
16                   </ Rectangle.Fill >
17               </ Rectangle >
18               < Ellipse  Width ="100"  Height ="100"  x:Name ="magnifiter"  Opacity ="0.5"  Fill ="White" >
19 
20               </ Ellipse >
21           </ Canvas >
22           < Canvas  x:Name ="im"  Width ="200"  Height ="200"  Canvas.Left ="600" >
23               < Image  Source ="a.jpg"   Width ="521"  Height ="715"  x:Name ="img" ></ Image >
24               < Canvas.Clip >
25                       < EllipseGeometry  RadiusX ="100"  RadiusY ="100"  Center ="100,100" />
26                   </ Canvas.Clip >
27              
28               </ Canvas >
29       </ Grid >
30  </ UserControl >

 

MainPage.xaml.cs

 

代碼
 1  namespace  magnifier
 2  {
 3       public   partial   class  MainPage : UserControl
 4      {
 5           bool  IsMouseDown  =   false ;
 6          Point mousep;
 7 
 8           public  MainPage()
 9          {
10              InitializeComponent();
11              magnifiter.MouseLeftButtonDown  +=   new  MouseButtonEventHandler(magnifiter_MouseLeftButtonDown);
12              magnifiter.MouseLeftButtonUp  +=   new  MouseButtonEventHandler(magnifiter_MouseLeftButtonUp);
13              magnifiter.MouseMove  +=   new  MouseEventHandler(magnifiter_MouseMove);
14          }
15 
16           void  magnifiter_MouseMove( object  sender, MouseEventArgs e)
17          {
18               
19               if  (IsMouseDown)
20              {
21                   double  DeltaV  =  e.GetPosition( null ).Y  -  mousep.Y;
22                   double  DeltaH  =  e.GetPosition( null ).X  -  mousep.X;
23                   double  NewTop  =  DeltaV  +  ( double )magnifiter.GetValue(Canvas.TopProperty);
24                   double  NewLeft  =  DeltaH  +  ( double )magnifiter.GetValue(Canvas.LeftProperty);
25                  magnifiter.SetValue(Canvas.LeftProperty, NewLeft);
26                  magnifiter.SetValue(Canvas.TopProperty, NewTop);
27                  mousep  =  e.GetPosition( null );
28                  mag();
29              }
30             
31          }
32 
33           void  magnifiter_MouseLeftButtonUp( object  sender, MouseButtonEventArgs e)
34          {
35              IsMouseDown  =   false ;
36              mousep.X  =  mousep.Y  =   0 ;
37          }
38 
39           void  magnifiter_MouseLeftButtonDown( object  sender, MouseButtonEventArgs e)
40          {
41              mousep  =  e.GetPosition( null );
42              
43              IsMouseDown  =   true ;
44          }
45           public   void  mag()
46          {
47               double  n  =  img.Width  /  rect.Width;
48               double  left  =  ( double )magnifiter.GetValue(Canvas.LeftProperty);
49               double  top  =  ( double )magnifiter.GetValue(Canvas.TopProperty);
50               double  newleft  =   - *  left;
51               double  newtop  =   - *  top;
52              img.SetValue(Canvas.LeftProperty, newleft);
53              img.SetValue(Canvas.TopProperty, newtop);
54          }
55      }
56  }

 

最終效果以下:

 

相關文章
相關標籤/搜索