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

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

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

一、WPF中图片局部放大

1.xaml中代码:

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

2.xaml.cs中代码:

private void MoveRect_MouseMove(object sender, MouseEventArgs e)
{
FrameworkElement element = sender as FrameworkElement; //计算鼠标在X轴的移动距离
double deltaV = e.GetPosition(MoveRect).Y - MoveRect.Height / 2;
//计算鼠标在Y轴的移动距离
double deltaH = e.GetPosition(MoveRect).X - MoveRect.Width / 2; ;
//得到图片Top新位置
double newTop = deltaV + (double)MoveRect.GetValue(Canvas.TopProperty);
//得到图片Left新位置
double newLeft = deltaH + (double)MoveRect.GetValue(Canvas.LeftProperty); //边界的判断
if (newLeft <= 0)
{
newLeft = 0;
} //左侧图片框宽度 - 半透明矩形框宽度
if (newLeft >= (this.SmallBox.Width - this.MoveRect.Width))
{
newLeft = this.SmallBox.Width - this.MoveRect.Width;
} if (newTop <= 0)
{
newTop = 0;
} //左侧图片框高度度 - 半透明矩形框高度度
if (newTop >= this.SmallBox.Height - this.MoveRect.Height)
{
newTop = this.SmallBox.Height - this.MoveRect.Height;
}
MoveRect.SetValue(Canvas.TopProperty, newTop);
MoveRect.SetValue(Canvas.LeftProperty, newLeft);
#region
//获取右侧大图框与透明矩形框的尺寸比率
double n = this.BigBox.Width / this.MoveRect.Width; //获取半透明矩形框在左侧小图中的位置
double left = (double)this.MoveRect.GetValue(Canvas.LeftProperty);
double top = (double)this.MoveRect.GetValue(Canvas.TopProperty); //计算和设置原图在右侧大图框中的Canvas.Left 和 Canvas.Top
bigImg.SetValue(Canvas.LeftProperty, -left * n);
bigImg.SetValue(Canvas.TopProperty, -top * n);
#endregion
} private void SmallBox_MouseEnter(object sender, MouseEventArgs e)
{
BigBox.Visibility = Visibility.Visible;
} private void SmallBox_MouseLeave(object sender, MouseEventArgs e)
{
BigBox.Visibility = Visibility.Hidden;
}

3.效果:

二、Winform中图片局部放大

1.代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 图片局部放大
{
public partial class Form1 : Form
{
public static int i = 0;
private Point m_ptStart = new Point(0, 0);
private Point m_ptEnd = new Point(0, 0);
private bool m_bMouseDown = false;
private float xRate, yRate, realX1, realY1, realX2, realY2;
int pLeft = 0;
int pTop = 0; public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
xRate = (float)pictureBox1.Image.Width / pictureBox1.Width;
yRate = (float)pictureBox1.Image.Height / pictureBox1.Height;
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
SetStyle(ControlStyles.DoubleBuffer, true); //双缓冲
} private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (pictureBox1.HasChildren)
{
for (int i = 0; i < pictureBox1.Controls.Count; i++)
{
pictureBox1.Controls.RemoveAt(0);
}
}
if (e.Button != MouseButtons.Left)
{
return;
}
m_ptEnd = new Point(e.X, e.Y);
this.pictureBox1.Refresh();
realX1 = e.X * xRate;
realY1 = e.Y * yRate;
if (!m_bMouseDown)
{
m_ptStart = new Point(e.X, e.Y);
m_ptEnd = new Point(e.X, e.Y);
}
m_bMouseDown = !m_bMouseDown;
} private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (m_ptEnd.X - m_ptStart.X < 0 || m_ptEnd.Y - m_ptStart.Y < 0)
{
return;
}
if (m_ptEnd.X - m_ptStart.X >= 100)
{
m_ptEnd.X = m_ptStart.X + 100;
}
if (m_ptEnd.Y - m_ptStart.Y >= 100)
{
m_ptEnd.Y = m_ptStart.Y + 100;
}
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);
} private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
int eX = 0, eY = 0;
if (e.Button != MouseButtons.Left)
{
return;
}
if (e.X - m_ptStart.X >= 100)
{
if (e.X >= pictureBox1.Width - 1)
{
if (pictureBox1.Width - m_ptStart.X - 1 > 100)
{
eX = m_ptStart.X + 100;
}
else
{
eX = pictureBox1.Width - 1;
}
}
else
{
eX = m_ptStart.X + 100;
}
}
else
{
if (e.X >= pictureBox1.Width - 1)
{
eX = pictureBox1.Width - 1;
}
else
{
eX = e.X;
}
}
if (e.Y - m_ptStart.Y >= 100)
{
if (e.Y >= pictureBox1.Height - 1)
{
if (pictureBox1.Height - m_ptStart.Y - 1 > 100)
{
eX = m_ptStart.Y + 100;
}
else
{
eY = pictureBox1.Height - 1;
}
}
else
{
eY = m_ptStart.Y + 100;
}
}
else
{
if (e.Y >= pictureBox1.Height - 1)
{
eY = pictureBox1.Height - 1;
}
else
{
eY = e.Y;
}
}
if (m_ptStart.X >= 0 && m_ptEnd.X >= 0
&& m_ptStart.Y >= 0 && m_ptEnd.Y >= 0
&& m_ptStart.X <= 254 && m_ptEnd.X <= 254
&& m_ptStart.Y <= 163 && m_ptEnd.Y <= 163)
{
m_ptEnd = new Point(eX, eY);
m_bMouseDown = !m_bMouseDown;
this.pictureBox1.Refresh();
}
else
{
m_ptEnd = new Point(eX, eY);
m_ptEnd = m_ptStart;
m_bMouseDown = !m_bMouseDown;
this.pictureBox1.Refresh();
}
realX2 = eX * xRate;
realY2 = eY * yRate;
Crop((Bitmap)pictureBox1.Image);
Panel p = new Panel();
p.Name = "panel1";
p.Location = new Point((int)(realX1 / xRate), (int)(realY1 / yRate));
p.Size = new Size((int)(realX2 / xRate - realX1 / xRate), (int)(realY2 / yRate - realY1 / yRate));
//p.BackColor = Color.Transparent;
p.BackColor = Color.FromArgb(100, 135, 206, 250);//Azure 240 255 255
p.BorderStyle = BorderStyle.FixedSingle;
p.MouseDown += (s1, e1) =>
{
pLeft = e1.X;
pTop = e1.Y;
};
p.MouseMove += (s2, e2) =>
{
GC.Collect();
if (e2.Button.ToString().Equals("Left"))
{
if (p.Location.X + e2.X - pLeft <= 1)
{
p.Left = 1;
}
else if (p.Location.X + e2.X - pLeft >= pictureBox1.Width - p.Width)
{
p.Left = pictureBox1.Width - p.Width - 1;
}
else
{
p.Left = p.Location.X + e2.X - pLeft;
}
if (p.Location.Y + e2.Y - pTop <= 1)
{
p.Top = 1;
}
else if (p.Location.Y + e2.Y - pTop >= pictureBox1.Height - p.Height)
{
p.Top = pictureBox1.Height - p.Height - 1;
}
else
{
p.Top = p.Location.Y + e2.Y - pTop;
}
}
Crop((Bitmap)pictureBox1.Image, Convert.ToInt32(p.Location.X * xRate), Convert.ToInt32(p.Location.Y * yRate), Convert.ToInt32(p.Width), Convert.ToInt32(p.Height));
};
pictureBox1.Controls.Add(p);
} private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left)
{
return;
}
m_ptEnd = new Point(e.X, e.Y);
this.pictureBox1.Refresh();
}
private void Crop(Bitmap bitmap)
{
if ((int)(realX2 - realX1) > 0 && (int)(realY2 - realY1) > 0)
{
GC.Collect();
//GC.WaitForPendingFinalizers();
Rectangle rec = new Rectangle((int)realX1, (int)realY1, (int)(realX2 - realX1), (int)(realY2 - realY1));
pictureBox2.Image = bitmap.Clone(rec, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
}
}
private void Crop(Bitmap bitmap, int X, int Y, int width, int height)
{
if (width > 0 && height > 0)
{
Rectangle rec = new Rectangle(X, Y, width, height);
try
{
GC.Collect();
//GC.WaitForPendingFinalizers();
pictureBox2.Image = bitmap.Clone(rec, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
//bitmap.Dispose();
}
catch (Exception ex)
{
i++;
}
finally
{
}
}
}
}
}

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. HDU 1248 寒冰王座 完全背包

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1248 中文题,大意就不说了. 第一道完全背包题,跟着背包九讲做的. 和0-1背包的区别在于所不同的是每种 ...

  2. java实现微信支付宝等多个支付平台合一的二维码支付(maven+spring springmvc mybatis框架)

    首先申明,本人实现微信支付宝等支付平台合多为一的二维码支付,并且实现有效时间内支付有效,本人采用的框架是spring springmvc mybatis 框架,maven管理.其实如果支付,不需要my ...

  3. 解密Arm中国:全球最具影响力的芯片公司中国布局浮出水面

    经济观察报 记者 陈伊凡 沈怡然 李华清 对于Arm与中国合资公司事宜,5月4日下午,Arm授权的代表邮件回复<经济观察报>称:“合资公司目前刚开始运营”,“我们的重点是让这个新的合资公司 ...

  4. js课程 2-7 for-in循环怎么使用

    js课程 2-7 for-in循环怎么使用 一.总结 一句话总结:用的是in的作用加上for的作用,相当于一个组合技. 1.js中in运算符的作用是什么? 判断一个元素是否在一个集合或者对象中 1.a ...

  5. js获取图片的尺寸

    $("<img/>").attr("src", "http://www.example.com/images/bag001.jpg&quo ...

  6. DC综合:划分与编码风格

    划分与编码风格 合理的设计划分和好的HDL编码风格对成功的综合影响很大. 逻辑划分是成功综合(和布局布线,如果布图是层次化的)的关键. 综合划分 "分而治之" 把复杂的设计化简为更 ...

  7. tipc

    TIPC SOCKET实现分析 http://ju.outofmemory.cn/entry/158241

  8. Android的NDK开发(2)————利用Android NDK编写一个简单的HelloWorld

    1.Android NDK简介 NDK全称为native development kit本地语言(C&C++)开发包.而对应的是经常接触的Android-SDK,(software devel ...

  9. TensorFlow 辨异 —— tf.add(a, b) 与 a+b(tf.assign 与 =)、tf.nn.bias_add 与 tf.add

    1. tf.add(a, b) 与 a+b 在神经网络前向传播的过程中,经常可见如下两种形式的代码: tf.add(tf.matmul(x, w), b) tf.matmul(x, w) + b 简而 ...

  10. 学习鸟哥的Linux私房菜笔记(15)——文件系统

    一.文件结构 为了能在设备上存储与读取文件,我们需要在分区上创立文件系统 文件系统记录目录与文件我们称之为文件结构 每一个文件系统在Linux里都被解释成由一个根目录为起点的目录结构 Linux将各个 ...