zoukankan      html  css  js  c++  java
  • wpf图片浏览器,实现缩放平移操作图片切换等功能

    wpf经常要用到控件来查看图片,尤其是高清图片,于是做了一个例子:

    1.定义图片的队列,用list来存。

      private readonly List<string> files;
    

      

    2.切换图片。

    给图片的imageSource赋值。在快速切换的时候,这种方法的效果还行,占用内存并不高。

       var bmp = new BitmapImage(new Uri(files[i]));
                Img.Source = bmp;
                i++; 
                GC.Collect();
                GC.WaitForPendingFinalizers();
    

      

    3.定义xaml元素,给图片一个变换矩阵。

      <ScrollViewer x:Name="Sv">
                <Viewbox  x:Name="Box" 
                          MouseWheel="Box_OnMouseWheel"
                          PreviewMouseLeftButtonDown="Box_OnPreviewMouseLeftButtonDown"
                          PreviewMouseLeftButtonUp="Box_OnPreviewMouseLeftButtonUp"
                          PreviewMouseMove="Box_OnPreviewMouseMove"
                          Stretch="Uniform">
                    <Viewbox.RenderTransform>
                        <MatrixTransform>
                            <MatrixTransform.Matrix>
                                <Matrix OffsetX="0"
                                        OffsetY="0" />
                            </MatrixTransform.Matrix>
                        </MatrixTransform>
                    </Viewbox.RenderTransform>
                    <Grid>
                        <Image  x:Name="Img"></Image>
    
                        <Grid x:Name="InfoGrid" Visibility="Collapsed">
                           
                        </Grid>
                    </Grid>
                </Viewbox>
     </ScrollViewer>
    

      4.给图片上加一个标识,显示图片上的小图标,图标跟着图片运动。(根据实际情况需要来加或者不加)

       <Ellipse Width="50"
                                     Height="50"
                                     RenderTransformOrigin="0.5,0.5"
                                     x:Name="Rect"
                                     HorizontalAlignment="Stretch"
                                     VerticalAlignment="Stretch"
                                     SnapsToDevicePixels="True"
                                     Visibility="Visible">
                                <Ellipse.Fill>
                                    <RadialGradientBrush>
    
                                        <GradientStop Color="#FF9494"
                                                      Offset="1" />
                                        <GradientStop Color="#FF2727"
                                                      Offset="0.664" />
                                        <GradientStop Color="#AC0000"
                                                      Offset="0.29" />
                                        <GradientStop Color="#FFF4F7F4"
                                                      Offset="0" />
                                    </RadialGradientBrush>
                                </Ellipse.Fill>
                                <Ellipse.RenderTransform>
                                    <ScaleTransform x:Name="Stf"
                                                    ScaleX="0.5"
                                                    ScaleY="0.5">
                                    </ScaleTransform>
                                </Ellipse.RenderTransform>
                            </Ellipse>
    

      

    5.变换(拖动平移,放大缩小)

    这些在后台cs代码中做。

    缩放代码:

     var m = ((MatrixTransform) ctrl.RenderTransform).Matrix;
                if (big)
                {
                    m.ScaleAtPrepend(1.1, 1.1, centerX, centerY);
                }
                else
                {
                    m.ScaleAtPrepend(1/1.1, 1/1.1, centerX, centerY);
                }
                ctrl.RenderTransform = new MatrixTransform(m);
    

      移动代码:

       var point = e.MouseDevice.GetPosition(Sv);
                var m = Box.RenderTransform.Value;
                //计算x偏移量 
                m.OffsetX = m.OffsetX + point.X - start.X;
                //计算y偏移量
                m.OffsetY = m.OffsetY + point.Y - start.Y;
                Box.RenderTransform = new MatrixTransform(m);
    

      

    效果如下:

    可以用鼠标任意缩放图片了。

    源码如下:

    https://files.cnblogs.com/files/lizhijian/viewbox%E7%BC%A9%E6%94%BE.rar

    感谢阅读,希望对你有帮助。

  • 相关阅读:
    BZOJ 2190: [SDOI2008]仪仗队
    BZOJ 3195: [Jxoi2012]奇怪的道路
    【BZOJ-1068】压缩 区间DP
    【BZOJ-1103】大都市meg 树状数组 + DFS序
    【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分
    【BZOJ-3721】Final Bazarek 贪心
    【BZOJ-4690】Never Wait For Weights 带权并查集
    【BZOJ-2503】相框 并查集 + 分类讨论
    【BZOJ-3653】谈笑风生 DFS序 + 可持久化线段树
    【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心
  • 原文地址:https://www.cnblogs.com/congqiandehoulai/p/7986299.html
Copyright © 2011-2022 走看看