实现图片放大缩小和移动 C#

目标:实现图片放大缩小和移动

在这里插入图片描述

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;
using System.Drawing.Imaging;
using System.IO;
using System.Reflection;

namespace 图片放大缩小
{
    public partial class Form1 : Form
    {

        int xPos;
        int yPos;
        bool MoveFlag;
        public Form1()
        {
            InitializeComponent();
            this.MouseWheel += new MouseEventHandler(MainForm_MouseWheel);
        }
        byte[] picturebytes;
        Bitmap bmap;
        private void Button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "所有图片文件(*.bmp/*.jpg/*.gif)|*.*|Jpeg 文件(*.jpg)|*.jpg|Bitmap 文件(*.bmp)|*.bmp|gif 文件(*.gif)|*.gif";

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string fullpath = openFileDialog1.FileName;//文件路径
                System.IO.FileStream fs = new FileStream(fullpath, FileMode.Open);
                picturebytes = new byte[fs.Length];
                BinaryReader br = new BinaryReader(fs);
                picturebytes = br.ReadBytes(Convert.ToInt32(fs.Length));
                MemoryStream ms = new MemoryStream(picturebytes);
                 bmap = new Bitmap(ms);
                pictureBox1.Image = bmap;
            }
            else
            {
                MessageBox.Show("图片打开失败");
            }


        }

        private void PictureBox1_MouseDown(object sender, MouseEventArgs e)
        {

            this.pictureBox1.Focus();
            MoveFlag = true;//已经按下.
            xPos = e.X;//当前x坐标.
            yPos = e.Y;//当前y坐标.


        }

        float Scale = 1;
        private void MainForm_MouseWheel(object sender, MouseEventArgs e)
        {

            //    MessageBox.Show("滚动事件已被捕捉");

            //System.Drawing.Size t = bmap.Size;
            //t.Width += e.Delta;
            //t.Height += e.Delta;
            //bmap.Width = t.Width;
            //bmap.Height = t.Height;

            //bmap.Width= t.Width;

            //System.Drawing.Size t = pictureBox1.Size;
            //t.Width += e.Delta;
            //t.Height += e.Delta;
            //pictureBox1.Width = t.Width;
            //pictureBox1.Height = t.Height;


            if (e.Delta < 0)
            {
                this.pictureBox1.Width = this.pictureBox1.Width * 9 / 10;
                this.pictureBox1.Height = this.pictureBox1.Height * 9 / 10;
            }
            else
            {
                this.pictureBox1.Width = this.pictureBox1.Width * 11 / 10;
                this.pictureBox1.Height = this.pictureBox1.Height * 11 / 10;
            }



        }

        private void PictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            //鼠标已经抬起
            MoveFlag = false;
        }

        private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (MoveFlag)
            {
                pictureBox1.Left += Convert.ToInt16(e.X - xPos);//设置x坐标.
                pictureBox1.Top += Convert.ToInt16(e.Y - yPos);//设置y坐标.
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# PictureBox控件的基本用法 PictureBox控件是Windows Forms中一个常用的图片显示控件,它可以展示各种格式的图像文件,常用的格式包括BMP、GIF、JPEG、PNG等等。PictureBox控件在实际应用中,可以为用户呈现各种业务数据,如图表、照片等等。同时,可以通过简单的设置,将多张图片展示为画廊式显示。下面,我们将围绕PictureBox控件,介绍一些它的基本用法和实际应用案例。 # PictureBox控件的属性设置 PictureBox控件是一个非常灵活的控件,在使用前我们可以通过设置属性,来为它添加各种功能。下面,我们将一一介绍它的属性设置。 ## 1. BackgroundImage和Image属性 这两个属性都是PictureBox控件展示图像的关键属性。其中,BackgroundImage属性可以设置PictureBox控件的背景图像,这个图像通常是一张小图或者纹理。而Image属性则可以设置PictureBox控件的正文图像,也就是我们通常展示的图像。需要注意的是,这两个属性只能设置其中一个,不能同时设置。 ## 2. Dock属性 Dock属性可以设置PictureBox控件在容器中的停靠方式。通常来说,我们想让图片控件充满整个容器,就会将它的Dock属性设置为Fill,这样就可以实现图片铺满整个容器的效果了。 ## 3. SizeMode属性 SizeMode属性决定了PictureBox控件在展示图像时的图像显示方式。通常情况下,我们可以选择Stretch属性,让图像铺满整个PictureBox控件;也可以选择Zoom属性,让图像等比缩放后铺满整个控件。 ## 4. ContextMenuStrip属性 这个属性决定了在PictureBox控件上右击鼠标时弹出的快捷菜单。例如,可以在上面添加“复制”、“保存”等常见的快捷功能,方便用户进行操作。 ## 5. MouseWheel事件 最后需要介绍的是PictureBox控件的MouseWheel事件。该事件是鼠标滚轮事件,可以在鼠标滚动时响应事件,并进行相应的操作。在PictureBox控件中,应用挺广泛的就是图片放大缩小移动操作,都可以在MouseWheel事件中进行操作。 # PictureBox控件的滚轮操作 PictureBox的鼠标滚轮事件通常用来实现图片放大缩小移动等基本操作,下面我们将分别介绍它们的实现方法。 ## 1. 图片放大缩小 图片放大缩小都是针对图像的尺寸进行操作的。而在PictureBox的SizeMode属性为Zoom模式下,我们可以通过修改控件的比例来实现图片的缩放。具体的,我们可以通过设置PictureBox控件的Scale属性或者它的Width和Height属性来实现缩放操作: ```c# // 放大图片 pictureBox1.Width = (int)(pictureBox1.Width * 1.1); pictureBox1.Height = (int)(pictureBox1.Height * 1.1); // 缩小图片 pictureBox1.Width = (int)(pictureBox1.Width * 0.9); pictureBox1.Height = (int)(pictureBox1.Height * 0.9); ``` ## 2. 图片移动 图片移动是指整个PictureBox控件在容器中的位置移动。在PictureBox控件上响应鼠标滚轮事件时,我们可以通过修改PictureBox控件的Location属性,来达到移动图片的效果。例如,我们可以通过鼠标滚轮向上或向下滚动,来实现图片向上或向下移动的效果: ```c# // 上滑图片向上移动 pictureBox1.Location = new Point(pictureBox1.Location.X, pictureBox1.Location.Y - 10); // 下滑图片向下移动 pictureBox1.Location = new Point(pictureBox1.Location.X, pictureBox1.Location.Y + 10); ``` # 实际应用案例:滚动拖拽PictureBox控件 最后,我们需要介绍的是一个比较实用的应用场景:通过鼠标滚轮实现PictureBox控件的拖拽滚动。这个应用场景常常用来展示大量图片的画廊效果,方便用户进行查看。 实现该效果的关键是通过鼠标滚轮事件,来控制PictureBox控件在容器中的位置。当用户使用鼠标滚轮时,我们需要根据鼠标滚轮的滚动距离,修改PictureBox控件相应的位置。 在实现该效果时,我们需要注意以下几点: - 首先,需要在PictureBox控件的MouseDown事件中判断一下是不是鼠标左键,以避免拖拽和滚轮事件出现冲突。 - 其次,需要在鼠标滚动事件MouseWheel中判断滚轮的滚动距离,计算并移动PictureBox控件的位置。 - 最后,需要在PictureBox控件重新绘制时,根据PictureBox控件的位置,来绘制当前显示的图片。 在实际应用中,我们可以将多张图片显示在一个画廊中,当用户在一张图片上使用鼠标滚轮时,画廊随之滚动,展示下一张或上一张图片,并且控件的位置始终保持在容器的中央。这样,用户就可以方便地实现对多张图片的查看。实现代码如下: ```c# // 当前显示的图片在画廊中的位置 private int picIndex = 0; // 鼠标是否按下 private bool isMouseDown = false; // 滚动条卷动的值 private int wheelValue = 0; // 鼠标的坐标位置 private int mouseX = 0; private int mouseY = 0; private void galleryPictureBox_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { this.isMouseDown = true; this.mouseX = e.X; this.mouseY = e.Y; } } private void galleryPictureBox_MouseUp(object sender, MouseEventArgs e) { this.isMouseDown = false; } private void galleryPictureBox_MouseMove(object sender, MouseEventArgs e) { if (this.isMouseDown) { Point currMousePoint = new Point(e.X, e.Y); Point mouseOffset = new Point(currMousePoint.X - this.mouseX, currMousePoint.Y - this.mouseY); this.galleryPictureBox.Location = new Point(this.galleryPictureBox.Location.X + mouseOffset.X, this.galleryPictureBox.Location.Y + mouseOffset.Y); } } private void galleryPictureBox_MouseWheel(object sender, MouseEventArgs e) { int newIndex = this.picIndex - e.Delta / SystemInformation.MouseWheelScrollDelta; // 判断滑动方向是否为向上滑动 if (newIndex >= 0 && newIndex < this.images.Count) { // 计算PictureBox移动的距离 int dx = (this.galleryPictureBox.Width - this.images[newIndex].Width) / 2; int dy = (this.galleryPictureBox.Height - this.images[newIndex].Height) / 2; int newLeft = -(this.images.Take(newIndex).Sum(img => img.Width + dx) + dx); // 修改PictureBox显示图片 this.picIndex = newIndex; this.galleryPictureBox.Image = this.images[this.picIndex]; // 移动PictureBox的位置 this.galleryPictureBox.Location = new Point(newLeft, dy); } } ``` 通过以上代码,我们可以实现一个非常简单但实用的画廊效果。用户在使用鼠标滚轮时,画廊会随之滚动,实现对多张图片的连续查看。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值