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

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

wpf图片浏览器,实现缩放平移操作图片切换等功能的更多相关文章

  1. Android 手势检测实战 打造支持缩放平移的图片预览效果(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...

  2. css技术之用最高和最宽的限制“max-height和max-width”做图片同比例缩放,达到图片不变形目的,做出批量打印图片功能,页面打印“window.print()”

    一.简介 他们是为流而生的,像width/height这种定死的砖头式布局,min-width/max-width就没有存在的意义 ,min-width/max-width一定是自适应布局或流体布局中 ...

  3. Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

    首先推荐一下鸿洋大大的打造个性的图片预览与多点触控视频教程,这套教程教我们一步一步实现了多点触控实现对图片的平移和缩放的功能.这篇文章我将在鸿洋大大的基础之上做了一些扩展功能: 1.图片的惯性滑动 2 ...

  4. PHP的图片处理类(缩放、加图片水印和剪裁)

    <!--test.php文件内容--> <?php //包含这个类image.class.php include "image.class.php"; $img ...

  5. PHP图片裁剪与缩放 / 无损裁剪图片

    图片太大且规格不统一,显示的控制需要靠JavaScript来完成,用在移动设备上时显示效果不好且流量巨大,需要对现有图片库的图片进行一次处理,生成符合移动设备用的缩略图,将原来客户端JS做的工作转移到 ...

  6. Android实现支持缩放平移图片

    本文主要用到了以下知识点 Matrix GestureDetector 能够捕捉到长按.双击 ScaleGestureDetector 用于检测缩放的手势 自由的缩放 需求:当图片加载时,将图片在屏幕 ...

  7. Bootstrap 3的box-sizing样式导致UMeditor控件的图片无法正常缩放

    UMeditor组件是百度提供的一套开源的web在线所见即所得富文本编辑器,是UEditor的简化版,UM的主要特点就是容量和加载速度上的改变,主文件的代码量为139k,而且放弃了使用传统的ifram ...

  8. css 如何实现图片等比例缩放

    在进行布局的时候,很多PM都要求图片等比例缩放,而且要求图片不失真,不变形,但是UI设计好了这个div的宽度又不能随意更改,而后台传过来的图片也不是等比例的图片,这就比较难受了,写成 width: 1 ...

  9. 利用canvas制作图片(可缩放和平移)+相框+文字

    前言: 公司一个售前问我能不能用H5做一个手机拍照,给相片添加相框和添加文字上传到服务器的功能,我当时一琢磨觉得可行,就利用空余时间做了一个demo,去掉了拍照和上传,如果以后有机会,会给补上,当然对 ...

随机推荐

  1. 基于Xilinx FPGA的视频图像采集系统

    本篇要分享的是基于Xilinx FPGA的视频图像采集系统,使用摄像头采集图像数据,并没有用到SDRAM/DDR.这个工程使用的是OV7670 30w像素摄像头,用双口RAM做存储,显示窗口为320x ...

  2. 洛谷 P1598 垂直柱状图【字符串+模拟】

    P1598 垂直柱状图 题目描述 写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字符在输入文件中出现的次数.严格地按照输出样例来安排你的输出格式. ...

  3. hihoCoder #1094 : Lost in the City(枚举,微软苏州校招笔试 12月27日 )

    #1094 : Lost in the City 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi gets lost in the city. He ...

  4. hihoCoder #1043 : 完全背包(板子题)

    #1043 : 完全背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的 ...

  5. Codeforces Round #449 (Div. 2)-897A.Scarborough Fair(字符替换水题) 897B.Chtholly's request(处理前一半) 897C.Nephren gives a riddle(递归)

    A. Scarborough Fair time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. 【django基础之ORM】

    一.定义 1.什么是ORM? ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候, ...

  7. phpstudy php5.4以上版本伪静态设置 thinkphp

    http://www.thinkphp.cn/topic/35958.html <IfModule mod_rewrite.c> Options +FollowSymlinks -Mult ...

  8. SVN版本库修改URL路径或者IP地址

    服务器的IP地址或者URL变更,版本库服务器的IP也要修改,因为当初安装SVN URL没有使用别名,所以使用的人都要修改客户端的IP,以下是参考网上的资料. 1.Windows TortoiseSVN ...

  9. MySQL密码忘了怎么办?MySQL重置root密码方法

    本文主要介绍Windows和Linux系统下忘记密码重置root密码的方法,需要的朋友可以参考下. MySQL有时候忘记了root密码是一件伤感的事.这里提供Windows 和 Linux 下的密码重 ...

  10. windows下安装redis3.2.100单机和集群详解

    下载redis 下载地址:https://github.com/MicrosoftArchive/redis/releases 我下载的是3.2.100版本的Redis-x64-3.2.100.zip ...