WPF和Winform中picturebox图片局部放大

简介: 原文:WPF和Winform中picturebox图片局部放大 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangyisen0713/article/details/19152607 ...
原文: 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.效果:



目录
相关文章
|
C# Windows
wpf怎么使用WindowsFormsHost(即winform控件)
原文:wpf怎么使用WindowsFormsHost(即winform控件) 使用方法:   1、首先,我们需要向项目中的引用(reference)中添加两个动态库dll,一个是.
5416 0
C#WPF 图片在显示时没有问题,但在运行时图片显示不出来的解决
选中项目,点击右上角的显示全部文件按钮,会将默认隐藏的文件显示出来,选中所需图片,右键,添加到项目,然后选择图片查看属性,生成操作选择resource。完毕。本人目前的解决方案。
445 41
C#WPF 图片在显示时没有问题,但在运行时图片显示不出来的解决
|
C# 容器
在WPF中使用winform控件WebBrowser
在WPF中使用winform控件WebBrowser
|
C#
WPF Image Source 设置相对路径图片
原文:WPF Image Source 设置相对路径图片   BitmapImage bt = new BitmapImage(new Uri("Images\\3_u10484.png", UriKind.Relative));this.Img1.Source = bt;
4003 0
|
C#
WPF 图片灰度处理
原文:WPF 图片灰度处理 文章的内容是来自微软中文技术论坛的一个帖子,当时是想将一段将图片灰度处理的代码转换为XAML的一个样式,在这里要谢谢 Xiao Yan Qiang、Sheldon _Xiao、shixin的热情回答,现在将他们的回答贴出来供大家学习参考.
1134 0
|
算法 容器 数据可视化
WPF_界面_图片/界面/文字模糊解决之道整理
原文:WPF_界面_图片/界面/文字模糊解决之道整理 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010265681/article/details/76651792 图片模糊: 图片尺寸:  检查图片,png, DPI=72,Stretch="None",原图尺寸和xaml里面写的尺寸一致。
1309 0
|
C#
WinForm和WPF颜色对象的转换
原文:WinForm和WPF颜色对象的转换 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangli321456/article/details/52956846 ...
874 0
|
JSON C# 数据格式
【WPF/C#】联网异步获取二进制文件(如图片)的流程
原文:【WPF/C#】联网异步获取二进制文件(如图片)的流程 步骤: 联网异步获取Json数据。 使用Json.NET工具,反序列化Json为对应的实体类,获得该实体类的对象。 从对象身上获取图片路径(实体类中定义了头像图片是string类型的文件路径)。
1321 0
|
C#
【WPF】ImageMagick调节图片的颜色
原文:【WPF】ImageMagick调节图片的颜色 需求:打开一张图片后,自由调节图片的颜色(色调)。 思路:读取显示一张图片后,用ColorPicker取色器选择一种颜色,之后将图片的色调调节为该颜色。
1549 0
|
C# Windows
Winform与WPF对话框(MessageBox, Dialog)之比较
原文:Winform与WPF对话框(MessageBox, Dialog)之比较 Winform:使用System.Windows.Forms命名空间中相应控件; WPF则调用Microsoft.Win32。
2479 0