1. 程式人生 > 其它 >Winform圖片移動與縮放

Winform圖片移動與縮放

摘要

在機器視覺專案中,經常用c#做Winform介面交付給客戶使用,在介面中,可能輸入的圖片比較大,一般的顯示器解析度無法顯示全,然後還需要放大看清楚圖片裡面的文字內容,所以需要用到圖片的拖拽與縮放功能。


首先新建一個窗體,拖一個panel控制元件到窗體中,然後在拖一個pictureobx控制元件到panel中,然後在添加個開啟圖片的按鈕:

全部程式碼:

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.Reflection; namespace 影象平移和縮放 { public partial class Form1 : Form { Bitmap myBmp; Point mouseDownPoint = new Point(); //記錄拖拽過程滑鼠位置 bool isMove = false; //判斷滑鼠在picturebox上移動時,是否處於拖拽過程(滑鼠左鍵是否按下)
int zoomStep = 20; //縮放步長 public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string filename = ""; OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter
= "Tiff檔案|*.tif|Bmp檔案|*.bmp|Erdas img檔案|*.img|EVNI檔案|*.hdr|jpeg檔案|*.jpg|raw檔案|*.raw|vrt檔案|*.vrt|所有檔案|*.*"; dlg.FilterIndex = 8; if (dlg.ShowDialog() == DialogResult.OK) { filename = dlg.FileName; } if (filename == "") { return; } myBmp = new Bitmap(filename); if (myBmp == null) { MessageBox.Show("讀取失敗"); return; } textBox1.Text = filename; pictureBox1.Image = myBmp; pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; //設定picturebox為縮放模式 pictureBox1.Width = myBmp.Width; pictureBox1.Height = myBmp.Height; } //滑鼠按下功能 private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; isMove = true; pictureBox1.Focus(); } } //滑鼠鬆開功能 private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { isMove = false; } } //滑鼠移動功能 private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { pictureBox1.Focus(); if (isMove) { int x, y; int moveX, moveY; moveX = Cursor.Position.X - mouseDownPoint.X; moveY = Cursor.Position.Y - mouseDownPoint.Y; x = pictureBox1.Location.X + moveX; y = pictureBox1.Location.Y + moveY; pictureBox1.Location = new Point(x, y); mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; } } //滑鼠滾輪滾動功能 private void pictureBox1_MouseWheel(object sender, MouseEventArgs e) { int x = e.Location.X; int y = e.Location.Y; int ow = pictureBox1.Width; int oh = pictureBox1.Height; int VX, VY; if (e.Delta > 0) { pictureBox1.Width += zoomStep; pictureBox1.Height += zoomStep; PropertyInfo pInfo = pictureBox1.GetType().GetProperty("ImageRectangle", BindingFlags.Instance | BindingFlags.NonPublic); Rectangle rect = (Rectangle)pInfo.GetValue(pictureBox1, null); pictureBox1.Width = rect.Width; pictureBox1.Height = rect.Height; } if (e.Delta < 0) { if (pictureBox1.Width < myBmp.Width / 10) return; pictureBox1.Width -= zoomStep; pictureBox1.Height -= zoomStep; PropertyInfo pInfo = pictureBox1.GetType().GetProperty("ImageRectangle", BindingFlags.Instance | BindingFlags.NonPublic); Rectangle rect = (Rectangle)pInfo.GetValue(pictureBox1, null); pictureBox1.Width = rect.Width; pictureBox1.Height = rect.Height; } VX = (int)((double)x * (ow - pictureBox1.Width) / ow); VY = (int)((double)y * (oh - pictureBox1.Height) / oh); pictureBox1.Location = new Point(pictureBox1.Location.X + VX, pictureBox1.Location.Y + VY); } } }

需要注意一點:

類裡面用到了一個pictureBox1_MouseWheel 事件,這個是picturebox控制元件沒有的事件,所以需要手動去新增這個事件,可以直接在form1的Designer.cs中新增:

 this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseWheel); 

實現效果: