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();
}
}
}

浙公网安备 33010602011771号