原文:WPF和Winform中picturebox图片局部放大

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangyisen0713/article/details/19152607

(代码不多,就只放代码了)

一、WPF中图片局部放大

1.xaml中代码:

  1. <Window x:Class="WpfZoom.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="WPF局部放大效果" Height="370" Width="700" WindowStartupLocation="CenterScreen">
  5. <Canvas x:Name="RootCanvas">
  6. <!--左侧小图-->
  7. <Canvas x:Name="SmallBox" MouseMove="MoveRect_MouseMove" MouseEnter="SmallBox_MouseEnter" MouseLeave="SmallBox_MouseLeave" Width="320" Height="180" Canvas.Left="20" Canvas.Top="20">
  8. <Canvas.Background>
  9. <ImageBrush ImageSource="Images/mm.jpg" Stretch="Fill" TileMode="None" />
  10. </Canvas.Background>
  11. <!--半透明矩形框-->
  12. <Rectangle x:Name="MoveRect" Fill="White" Opacity="0.3" Stroke="Blue" Width="50" Height="50" Canvas.Top="78" Canvas.Left="202"/>
  13. </Canvas>
  14. <!--右侧大图-->
  15. <Canvas x:Name="BigBox" Width="300" Height="300" Canvas.Left="360" Canvas.Top="20" Visibility="Collapsed">
  16. <!--右侧原图片 注意尺寸-->
  17. <Image x:Name="bigImg" Width="1920" Height="1080" Canvas.Left="0" Canvas.Top="-780" Source="Images/mm.jpg" />
  18. <Canvas.Clip>
  19. <RectangleGeometry Rect="0,0,300,300" />
  20. </Canvas.Clip>
  21. </Canvas>
  22. </Canvas>
  23. </Window>

2.xaml.cs中代码:

  1. private void MoveRect_MouseMove(object sender, MouseEventArgs e)
  2. {
  3. FrameworkElement element = sender as FrameworkElement;
  4. //计算鼠标在X轴的移动距离
  5. double deltaV = e.GetPosition(MoveRect).Y - MoveRect.Height / 2;
  6. //计算鼠标在Y轴的移动距离
  7. double deltaH = e.GetPosition(MoveRect).X - MoveRect.Width / 2; ;
  8. //得到图片Top新位置
  9. double newTop = deltaV + (double)MoveRect.GetValue(Canvas.TopProperty);
  10. //得到图片Left新位置
  11. double newLeft = deltaH + (double)MoveRect.GetValue(Canvas.LeftProperty);
  12. //边界的判断
  13. if (newLeft <= 0)
  14. {
  15. newLeft = 0;
  16. }
  17. //左侧图片框宽度 - 半透明矩形框宽度
  18. if (newLeft >= (this.SmallBox.Width - this.MoveRect.Width))
  19. {
  20. newLeft = this.SmallBox.Width - this.MoveRect.Width;
  21. }
  22. if (newTop <= 0)
  23. {
  24. newTop = 0;
  25. }
  26. //左侧图片框高度度 - 半透明矩形框高度度
  27. if (newTop >= this.SmallBox.Height - this.MoveRect.Height)
  28. {
  29. newTop = this.SmallBox.Height - this.MoveRect.Height;
  30. }
  31. MoveRect.SetValue(Canvas.TopProperty, newTop);
  32. MoveRect.SetValue(Canvas.LeftProperty, newLeft);
  33. #region
  34. //获取右侧大图框与透明矩形框的尺寸比率
  35. double n = this.BigBox.Width / this.MoveRect.Width;
  36. //获取半透明矩形框在左侧小图中的位置
  37. double left = (double)this.MoveRect.GetValue(Canvas.LeftProperty);
  38. double top = (double)this.MoveRect.GetValue(Canvas.TopProperty);
  39. //计算和设置原图在右侧大图框中的Canvas.Left 和 Canvas.Top
  40. bigImg.SetValue(Canvas.LeftProperty, -left * n);
  41. bigImg.SetValue(Canvas.TopProperty, -top * n);
  42. #endregion
  43. }
  44. private void SmallBox_MouseEnter(object sender, MouseEventArgs e)
  45. {
  46. BigBox.Visibility = Visibility.Visible;
  47. }
  48. private void SmallBox_MouseLeave(object sender, MouseEventArgs e)
  49. {
  50. BigBox.Visibility = Visibility.Hidden;
  51. }

3.效果:

二、Winform中图片局部放大

1.代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. namespace 图片局部放大
  11. {
  12. public partial class Form1 : Form
  13. {
  14. public static int i = 0;
  15. private Point m_ptStart = new Point(0, 0);
  16. private Point m_ptEnd = new Point(0, 0);
  17. private bool m_bMouseDown = false;
  18. private float xRate, yRate, realX1, realY1, realX2, realY2;
  19. int pLeft = 0;
  20. int pTop = 0;
  21. public Form1()
  22. {
  23. InitializeComponent();
  24. }
  25. private void Form1_Load(object sender, EventArgs e)
  26. {
  27. xRate = (float)pictureBox1.Image.Width / pictureBox1.Width;
  28. yRate = (float)pictureBox1.Image.Height / pictureBox1.Height;
  29. SetStyle(ControlStyles.UserPaint, true);
  30. SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
  31. SetStyle(ControlStyles.DoubleBuffer, true); //双缓冲
  32. }
  33. private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
  34. {
  35. if (pictureBox1.HasChildren)
  36. {
  37. for (int i = 0; i < pictureBox1.Controls.Count; i++)
  38. {
  39. pictureBox1.Controls.RemoveAt(0);
  40. }
  41. }
  42. if (e.Button != MouseButtons.Left)
  43. {
  44. return;
  45. }
  46. m_ptEnd = new Point(e.X, e.Y);
  47. this.pictureBox1.Refresh();
  48. realX1 = e.X * xRate;
  49. realY1 = e.Y * yRate;
  50. if (!m_bMouseDown)
  51. {
  52. m_ptStart = new Point(e.X, e.Y);
  53. m_ptEnd = new Point(e.X, e.Y);
  54. }
  55. m_bMouseDown = !m_bMouseDown;
  56. }
  57. private void pictureBox1_Paint(object sender, PaintEventArgs e)
  58. {
  59. if (m_ptEnd.X - m_ptStart.X < 0 || m_ptEnd.Y - m_ptStart.Y < 0)
  60. {
  61. return;
  62. }
  63. if (m_ptEnd.X - m_ptStart.X >= 100)
  64. {
  65. m_ptEnd.X = m_ptStart.X + 100;
  66. }
  67. if (m_ptEnd.Y - m_ptStart.Y >= 100)
  68. {
  69. m_ptEnd.Y = m_ptStart.Y + 100;
  70. }
  71. e.Graphics.DrawRectangle(System.Drawing.Pens.Blue, m_ptStart.X, m_ptStart.Y, m_ptEnd.X - m_ptStart.X, m_ptEnd.Y - m_ptStart.Y);
  72. }
  73. private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
  74. {
  75. int eX = 0, eY = 0;
  76. if (e.Button != MouseButtons.Left)
  77. {
  78. return;
  79. }
  80. if (e.X - m_ptStart.X >= 100)
  81. {
  82. if (e.X >= pictureBox1.Width - 1)
  83. {
  84. if (pictureBox1.Width - m_ptStart.X - 1 > 100)
  85. {
  86. eX = m_ptStart.X + 100;
  87. }
  88. else
  89. {
  90. eX = pictureBox1.Width - 1;
  91. }
  92. }
  93. else
  94. {
  95. eX = m_ptStart.X + 100;
  96. }
  97. }
  98. else
  99. {
  100. if (e.X >= pictureBox1.Width - 1)
  101. {
  102. eX = pictureBox1.Width - 1;
  103. }
  104. else
  105. {
  106. eX = e.X;
  107. }
  108. }
  109. if (e.Y - m_ptStart.Y >= 100)
  110. {
  111. if (e.Y >= pictureBox1.Height - 1)
  112. {
  113. if (pictureBox1.Height - m_ptStart.Y - 1 > 100)
  114. {
  115. eX = m_ptStart.Y + 100;
  116. }
  117. else
  118. {
  119. eY = pictureBox1.Height - 1;
  120. }
  121. }
  122. else
  123. {
  124. eY = m_ptStart.Y + 100;
  125. }
  126. }
  127. else
  128. {
  129. if (e.Y >= pictureBox1.Height - 1)
  130. {
  131. eY = pictureBox1.Height - 1;
  132. }
  133. else
  134. {
  135. eY = e.Y;
  136. }
  137. }
  138. if (m_ptStart.X >= 0 && m_ptEnd.X >= 0
  139. && m_ptStart.Y >= 0 && m_ptEnd.Y >= 0
  140. && m_ptStart.X <= 254 && m_ptEnd.X <= 254
  141. && m_ptStart.Y <= 163 && m_ptEnd.Y <= 163)
  142. {
  143. m_ptEnd = new Point(eX, eY);
  144. m_bMouseDown = !m_bMouseDown;
  145. this.pictureBox1.Refresh();
  146. }
  147. else
  148. {
  149. m_ptEnd = new Point(eX, eY);
  150. m_ptEnd = m_ptStart;
  151. m_bMouseDown = !m_bMouseDown;
  152. this.pictureBox1.Refresh();
  153. }
  154. realX2 = eX * xRate;
  155. realY2 = eY * yRate;
  156. Crop((Bitmap)pictureBox1.Image);
  157. Panel p = new Panel();
  158. p.Name = "panel1";
  159. p.Location = new Point((int)(realX1 / xRate), (int)(realY1 / yRate));
  160. p.Size = new Size((int)(realX2 / xRate - realX1 / xRate), (int)(realY2 / yRate - realY1 / yRate));
  161. //p.BackColor = Color.Transparent;
  162. p.BackColor = Color.FromArgb(100, 135, 206, 250);//Azure 240 255 255
  163. p.BorderStyle = BorderStyle.FixedSingle;
  164. p.MouseDown += (s1, e1) =>
  165. {
  166. pLeft = e1.X;
  167. pTop = e1.Y;
  168. };
  169. p.MouseMove += (s2, e2) =>
  170. {
  171. GC.Collect();
  172. if (e2.Button.ToString().Equals("Left"))
  173. {
  174. if (p.Location.X + e2.X - pLeft <= 1)
  175. {
  176. p.Left = 1;
  177. }
  178. else if (p.Location.X + e2.X - pLeft >= pictureBox1.Width - p.Width)
  179. {
  180. p.Left = pictureBox1.Width - p.Width - 1;
  181. }
  182. else
  183. {
  184. p.Left = p.Location.X + e2.X - pLeft;
  185. }
  186. if (p.Location.Y + e2.Y - pTop <= 1)
  187. {
  188. p.Top = 1;
  189. }
  190. else if (p.Location.Y + e2.Y - pTop >= pictureBox1.Height - p.Height)
  191. {
  192. p.Top = pictureBox1.Height - p.Height - 1;
  193. }
  194. else
  195. {
  196. p.Top = p.Location.Y + e2.Y - pTop;
  197. }
  198. }
  199. Crop((Bitmap)pictureBox1.Image, Convert.ToInt32(p.Location.X * xRate), Convert.ToInt32(p.Location.Y * yRate), Convert.ToInt32(p.Width), Convert.ToInt32(p.Height));
  200. };
  201. pictureBox1.Controls.Add(p);
  202. }
  203. private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
  204. {
  205. if (e.Button != MouseButtons.Left)
  206. {
  207. return;
  208. }
  209. m_ptEnd = new Point(e.X, e.Y);
  210. this.pictureBox1.Refresh();
  211. }
  212. private void Crop(Bitmap bitmap)
  213. {
  214. if ((int)(realX2 - realX1) > 0 && (int)(realY2 - realY1) > 0)
  215. {
  216. GC.Collect();
  217. //GC.WaitForPendingFinalizers();
  218. Rectangle rec = new Rectangle((int)realX1, (int)realY1, (int)(realX2 - realX1), (int)(realY2 - realY1));
  219. pictureBox2.Image = bitmap.Clone(rec, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
  220. }
  221. }
  222. private void Crop(Bitmap bitmap, int X, int Y, int width, int height)
  223. {
  224. if (width > 0 && height > 0)
  225. {
  226. Rectangle rec = new Rectangle(X, Y, width, height);
  227. try
  228. {
  229. GC.Collect();
  230. //GC.WaitForPendingFinalizers();
  231. pictureBox2.Image = bitmap.Clone(rec, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
  232. //bitmap.Dispose();
  233. }
  234. catch (Exception ex)
  235. {
  236. i++;
  237. }
  238. finally
  239. {
  240. }
  241. }
  242. }
  243. }
  244. }

2.效果:

WPF和Winform中picturebox图片局部放大的更多相关文章

  1. WPF与Winform中的不同(1)

    1. 部分控件的Text属性,变成了 Content属性 如: winform中,Button.Text = "abc"; wpf中,Button.Content = " ...

  2. C# winform中PictureBox控件的SizeMode模式

    SizeMode属性有五种模式, Normal →标准模式, 在此模式下, 图片位于PictureBox的左上角, 图片的大小由PictureBox控件的大小决定, 当图片的大小大于PictureBo ...

  3. C#winform中调用wpf

    原文:C#winform中调用wpf 在WinForm中是可以使用WPF中的控件(或者由WPF创建的自定义控件) 1.新建一个winform项目: 2.在解决方案上新建一个wpf项目: 如图: 如果有 ...

  4. Winform中Picture控件图片的拖拽显示

    注解:最近做了一个小工具,在Winform中对Picture控件有一个需求,可以通过鼠标从外部拖拽图片到控件的上,释放鼠标,显示图片! 首先你需要对你的整个Fom窗口的AllowDrop设置Ture ...

  5. C#winform中调用wpf(转)

    在WinForm中是可以使用WPF中的控件(或者由WPF创建的自定义控件) 1.新建一个winform项目: 2.在解决方案上新建一个wpf项目: 如图: 如果有如下错误,就在winform中的引用添 ...

  6. C# 保存PictureBox中的图片到数据库,并从数据库读取图片显示到PictrueBox,解决报错 “无效参数”

    下面是两段关键代码: /// <summary> /// 将一张图片转换为字节 /// </summary> /// <param name="img" ...

  7. WPF 引用DLL纯图像资源包类库中的图片

    原文:WPF 引用DLL纯图像资源包类库中的图片 1.建立WPF应用程序              过程略.   2.创建类库项目(图片资源包)       创建图片资源类库项目MyImages,删除 ...

  8. WPF中嵌入WinForm中的webbrowser控件

    原文:WPF中嵌入WinForm中的webbrowser控件 使用VS2008创建WPF应用程序,需使用webbrowser.从工具箱中添加WPF组件中的webbrowser发现其中有很多属性事件不能 ...

  9. c# winform 解决PictureBox 无法打印全部图片的问题

    一.   问题描述 在页面使用PictureBox 加载资料图片后,点击“打印”,只能打印图片首页,较大图片则无法全部打印. 二.   原因分析 PictureBox中打印图片时没有设置继续打印相关属 ...

随机推荐

  1. Java RMI使用

    1. Java RMI介绍 RMI:远程方法调用(Remote Method Invocation).能够让在某个java虚拟机上的对象像调用本地对象方法一样调用另一个java 虚拟机中的对象上的方法 ...

  2. swift学习第十二天:类的属性定义

    类的属性介绍 Swift中类的属性有多种 存储属性:存储实例的常量和变量 计算属性:通过某种方式计算出来的属性 类属性:与整个类自身相关的属性 存储属性 存储属性是最简单的属性,它作为类实例的一部分, ...

  3. 【MySQL】15个有用的MySQL/MariaDB性能调整和优化技巧

    MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...

  4. jquery formcheck.js

    demo下载链接http://pan.baidu.com/s/1hrDCC3y     /* Jquery 表单验证插件 janchie 2010.1 janchie@163.com 1.01版 */ ...

  5. mount新磁盘

    fdisk -l  mkfs.xfs /dev/xvdb  mkdir /data mount /dev/xvdb /data df -h vi /etc/fstab /dev/xvdb /data ...

  6. Ambari——大数据平台的搭建利器(一)

    Ambari 跟 Hadoop 等开源软件一样,也是 Apache Software Foundation 中的一个项目,并且是**项目.目前最新的发布版本是 2.0.1,未来不久将发布 2.1 版本 ...

  7. erlang局域网内节点通信——艰难四步曲

    http://blog.chinaunix.net/uid-22566367-id-382011.html 在Programming Erlang这本书中,在写到第十章中,主要实现的是不同节点之间的通 ...

  8. 解析字典包含关键字比如ID,description等,MJExtension 框架 不能直接设置变量与其同名。

    @property (nonatomic,strong) NSString *descrip;  //设置变量名 _DataReceived=(NSMutableArray *)[HZnewsmess ...

  9. 关于用什么作为dll版本号的思考

    作者:朱金灿 来源:http://blog.csdn.net/clever101 一个软件模块的版本如何维护呢?毫无疑问,它需要一个版本号.通过比对版本号就知道哪个高版本,哪个是低版本了.软件模块以d ...

  10. NOIP模拟 wall - 最大生成树

    题目大意: 给出n个点,第i个点坐标是(\(x_i, y_i\)),给出m条边,第i条边的权值是\(w_i\),求将图变成一颗树所需要删除边的最小权值和. 题目分析: 首先要看出坐标其实是出题人使出的 ...