WinForm图片的移动缩放

Posted baozi789654

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WinForm图片的移动缩放相关的知识,希望对你有一定的参考价值。

图片的移动:

         /// <summary>
        /// 记录鼠标是否按下了
        /// </summary>
        private bool isMouseDown;

        /// <summary>
        /// 记录 鼠标按下时的x,y坐标
        /// </summary>
        private Point mouseDownPoint;    

        //图片控件上 按下鼠标
        private void picbox_ProductPic_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                mouseDownPoint.X = Cursor.Position.X;
                mouseDownPoint.Y = Cursor.Position.Y;
                isMouseDown = true;
            }
        }

        //图片控件上 移动鼠标
        private void picbox_ProductPic_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMouseDown)
            {
                this.picbox_ProductPic.Left = this.picbox_ProductPic.Left + (Cursor.Position.X - mouseDownPoint.X);//移动图片,Left = Left + 当前鼠标点 - 鼠标点击时候的点
                this.picbox_ProductPic.Top = this.picbox_ProductPic.Top + (Cursor.Position.Y - mouseDownPoint.Y);//移动图片
                mouseDownPoint.X = Cursor.Position.X;//更新鼠标点坐标
                mouseDownPoint.Y = Cursor.Position.Y;//更新鼠标点坐标
            }
        }

        //图片控件上 释放鼠标
        private void picbox_ProductPic_MouseUp(object sender, MouseEventArgs e)
        {
            isMouseDown = false;
        }

  图片的缩放

private Image image_ori;//原始图片
private int zoomtime=0;//缩放的次数

this.MouseWheel+=new MouseEventHandler(picbox_ProductPic_MouseWheel);//滚轮监听事件
        private void picbox_ProductPic_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            int numberOfTextLinesToMove = 0;
            numberOfTextLinesToMove = e.Delta * SystemInformation.MouseWheelScrollLines / 120;

            if (cb_Zoom.Checked == false) numberOfTextLinesToMove = 0;

            if (numberOfTextLinesToMove > 0)
            {
                for (int i = 0; i < numberOfTextLinesToMove; i++)
                {
                    zoomtime++;
                    OperateClass.maxMin(picbox_ProductPic, image_ori, zoomtime);


                }
            }
            else if (numberOfTextLinesToMove < 0)
            {
                for (int i = 0; i > numberOfTextLinesToMove; i--)
                {
                    zoomtime--;
                    OperateClass.maxMin(picbox_ProductPic, image_ori, zoomtime);
                }
            }
        }

        //鼠标进入控件的可见部分
        private void picbox_ProductPic_MouseEnter(object sender, EventArgs e)
        {
            if (cb_Zoom.Checked == true)
            {
                picbox_ProductPic.Focus();
                OperateClass.resetPic(picbox_ProductPic);
            }
        }

用到的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

namespace _009_TPS.MyClass
{ 
    /// <summary>
    /// 图片操作的类
    /// </summary>
    class OperateClass
    {

        public static void SetSuitPictureBox(PictureBox picBox, Panel pan_picture)
        {
            picBox.Dock = DockStyle.Fill;
            picBox.SizeMode = PictureBoxSizeMode.Zoom;
            int x, y, height, width, vmax, hmax;
            x = pan_picture.HorizontalScroll.LargeChange;
            y = pan_picture.VerticalScroll.LargeChange;
            height = pan_picture.Height;
            width = pan_picture.Width;
            vmax = pan_picture.HorizontalScroll.Maximum;
            hmax = pan_picture.VerticalScroll.Maximum;
            try
            {

                Image image = Image.FromFile(picBox.ImageLocation);
                if (image.Height <= height && image.Width <= width)
                {
                    picBox.SizeMode = PictureBoxSizeMode.CenterImage;
                    picBox.Dock = DockStyle.Fill;
                }
                else
                {
                    picBox.SizeMode = PictureBoxSizeMode.AutoSize;
                    picBox.Dock = DockStyle.None;
                    picBox.Location = new Point(1, 0);
                    //MessageBox.Show("v--"+vmax+"-"+x+" h-- "+hmax+"-"+y);
                    pan_picture.AutoScrollPosition = new Point((vmax - x) / 2, (hmax - y) / 2);//设置滚动条位置为中间位置
                }
            }
            catch (Exception)
            {

            }

        }

        /// <summary>
        /// 设置为不停靠父容器,PictureBox大小等同于它所包含图像的大小
        /// </summary>
        /// <param name="picBox"></param>
        public static void resetPic(PictureBox picBox)
        {
            picBox.Dock = DockStyle.None;
            picBox.SizeMode = PictureBoxSizeMode.AutoSize;
        }

        /// <summary>
        /// 放大
        /// </summary>
        /// <param name="picBox"></param>
        public static void max(PictureBox picBox)
        {
            int w = picBox.Image.Width;
            int h = picBox.Image.Height;
            double div = Convert.ToDouble(h) / Convert.ToDouble(w);

            w = w + 30;
            h = Convert.ToInt32(w * div);

            picBox.Left -= 15;
            picBox.Top -= (h - picBox.Image.Height) / 2;
            Bitmap NewBitmap = new Bitmap(picBox.Image, w, h);
            picBox.Image = NewBitmap;
            NewBitmap.Dispose();
            //zoom_image(true,picBox,w,h);
        }

        /// <summary>
        /// 缩小
        /// </summary>
        /// <param name="picBox"></param>
        public static void min(PictureBox picBox)
        {
            int w = picBox.Image.Width;
            int h = picBox.Image.Height;
            double div = Convert.ToDouble(h) / Convert.ToDouble(w);

            if (w > 30 && (w - 30) * div > 1)
            {
                w = w - 30;
                h = Convert.ToInt32(w * div);
                picBox.Left += 15;
                picBox.Top -= (h - picBox.Image.Height) / 2;
            }
            Bitmap NewBitmap = new Bitmap(picBox.Image, w, h);
            picBox.Image = NewBitmap;
            NewBitmap.Dispose();
            //zoom_image(true, picBox, w, h);
        }


        /// <summary>
        /// 放大缩小
        /// </summary>
        /// <param name="picBox">PictureBox控件</param>
        /// <param name="img">原始图片</param>
        /// <param name="zoomtime">放大缩小次数,负为缩小,正为放大</param>
        /// <returns></returns>
        public static void maxMin(PictureBox picBox, Image img, int zoomtime)
        {
            int w = img.Width;
            int h = img.Height;
            Bitmap NewBitmap = new Bitmap(img);
            try
            {
                double div = Convert.ToDouble(h) / Convert.ToDouble(w);

                if (w > 30 && (w - 30) * div > 1)
                {
                    w = w + 30 * zoomtime;
                    h = Convert.ToInt32(w * div);

                    NewBitmap = new Bitmap(img, w, h);

                }

                //if (w < img.Width && h < img.Height)
                //{
                //    picBox.Location =new Point(0,0);
                // }

                picBox.Image = NewBitmap;
                //NewBitmap.Dispose();
                GC.Collect();

            }
            catch { }

        }


        /// <summary>
        /// 小于容器大小就不缩放
        /// </summary>
        /// <param name="picBox"></param>
        /// <param name="pan_picture"></param>
        /// <returns></returns>
        public static bool IsMaxMin(PictureBox picBox, Panel pan_picture)
        {
            bool yn = true;

            int w = picBox.Image.Width;
            int h = picBox.Image.Height;

            if (w < pan_picture.Width && h < pan_picture.Height)
            {
                SetSuitPictureBox(picBox, pan_picture);
                yn = false;
            }
            else
            {
                resetPic(picBox);
                yn = true;
            }

            return yn;
        }

        /// <summary>
        /// 绘制新Img
        /// </summary>
        /// <param name="chec"></param>
        /// <param name="pictureBox1"></param>
        /// <param name="w"></param>
        /// <param name="h"></param>
        private static void zoom_image(bool chec, PictureBox pictureBox1, int w, int h)
        {
            int begin_x = pictureBox1.Location.X;        //图片开始位置x
            int begin_y = pictureBox1.Location.Y;        //图片开始位置y

            Image image_ori = pictureBox1.Image;

            //int w, h;                      //缩放后的图片大小            
            if (chec)
            {
                if (begin_x + pictureBox1.Width > w) begin_x = w - pictureBox1.Width;
                if (begin_y + pictureBox1.Height > h) begin_y = h - pictureBox1.Height;
                if (begin_x < 0) begin_x = 0;
                if (begin_y < 0) begin_y = 0;
            }
            Bitmap resizedBmp = new Bitmap(w, h);
            Graphics g = Graphics.FromImage(resizedBmp);
            //g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
            //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
            g.DrawImage(image_ori, new Rectangle(0, 0, w, h), new Rectangle(0, 0, image_ori.Width, image_ori.Height), GraphicsUnit.Pixel);
            int ww, hh;
            ww = w;
            hh = h;
            if (pictureBox1.Width < ww) ww = pictureBox1.Width;
            if (pictureBox1.Height < hh) hh = pictureBox1.Height;
            try
            {
                pictureBox1.Image = resizedBmp;   //在图片框上显示区域图片
            }
            catch
            {
            }
            g.Dispose();
        }
    }
}

  

以上是关于WinForm图片的移动缩放的主要内容,如果未能解决你的问题,请参考以下文章

winform窗体的实现单击按钮实现图片放大缩小

Winform 最大化缩放不可移动

c# 在 winform 开发中,当鼠标移动到某图片时,该图片自动隐藏,移开时,又显示出来。求代码。

Halcon的HWindowControl控件在WinForm程序中的使用介绍(重点解决图片缩放的问题)

在winform中如何让图片控件根据键盘来移动

winform 添加鼠标移动监听