c# WinForm制作图片编辑工具(图像拖动、缩放、旋转、抠图)

C# WinForm制作图片编辑工具(图像拖动、缩放、旋转、抠图)

简介

本教程将介绍如何使用C# WinForm制作一个图片编辑工具,包括对图片进行拖动、缩放、旋转、抠图等操作,使用户可以自由编辑图片。通过本教程,你将学会如何使用C# WinForm框架,以及如何使用GDI+绘图库来实现图片编辑功能。

准备工作

在开始之前,请确保你已经安装了Visual Studio 2019及以上版本,并且安装了.NET框架。此外,需要掌握C#基础语法和WinForm开发知识,了解GDI+绘图库API。

步骤一:创建WinForm窗体

首先,我们需要创建一个WinForm窗体,并在窗体上添加一个PictureBox控件。PictureBox控件可以用来显示图片,并支持各种图片操作。

public partial class MainForm : Form
{
    private PictureBox pictureBox;

    public MainForm()
    {
        InitializeComponent();

        // 创建PictureBox控件
        pictureBox = new PictureBox();
        pictureBox.SizeMode = PictureBoxSizeMode.Zoom; // 图片等比缩放显示
        pictureBox.Dock = DockStyle.Fill;
        this.Controls.Add(pictureBox);
    }
}

步骤二:加载图片

我们需要在窗体加载的时候,把图片加载进PictureBox控件中。

private void MainForm_Load(object sender, EventArgs e)
{
    // 加载图片
    Bitmap bitmap = new Bitmap("test.jpg");
    pictureBox.Image = bitmap;
}

步骤三:拖动图片

拖动图片实际上是移动PictureBox控件。我们可以捕获用户的鼠标按下、移动和松开事件,计算鼠标在PictureBox控件的坐标,然后移动PictureBox控件。

private Point mouseOffset;

// 鼠标按下事件
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
    mouseOffset = new Point(-e.X, -e.Y);
}

// 鼠标移动事件
private void pictureBox_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        Point mousePos = Control.MousePosition;
        mousePos.Offset(mouseOffset.X, mouseOffset.Y);
        pictureBox.Location = pictureBox.Parent.PointToClient(mousePos);
    }
}

// 鼠标松开事件
private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
    // 无需操作
}

步骤四:缩放图片

缩放图片需要改变PictureBox控件的大小。我们可以使用鼠标的滚轮事件来控制缩放大小,每次滚动鼠标滚轮都会触发该事件。

private void pictureBox_MouseWheel(object sender, MouseEventArgs e)
{
    int step = e.Delta / 120;
    int newWidth = pictureBox.Width + step * 10;
    int newHeight = pictureBox.Height + step * 10;
    if (newWidth > 0 && newHeight > 0)
    {
        pictureBox.Width = newWidth;
        pictureBox.Height = newHeight;
    }
}

步骤五:旋转图片

旋转图片需要使用GDI+绘图库中的RotateTransform方法来进行旋转。我们可以使用TrackBar控件来控制旋转角度。

private int _rotateAngle = 0;

// TrackBar控件滑动事件
private void trackBar1_Scroll(object sender, EventArgs e)
{
    _rotateAngle = trackBar1.Value;
    pictureBox.Invalidate(); // 重绘PictureBox控件
}

// PictureBox控件重绘事件
private void pictureBox_Paint(object sender, PaintEventArgs e)
{
    if (pictureBox.Image != null)
    {
        Bitmap bitmap = new Bitmap(pictureBox.Image);
        Graphics graphics = e.Graphics;
        graphics.TranslateTransform(pictureBox.Width / 2, pictureBox.Height / 2);
        graphics.RotateTransform(_rotateAngle);
        graphics.DrawImage(bitmap, -pictureBox.Image.Width / 2, -pictureBox.Image.Height / 2,
            pictureBox.Image.Width, pictureBox.Image.Height);
    }
}

步骤六:抠图

抠图需要使用GDI+绘图库中的GraphicsPath类和Region类来进行操作。我们可以在PictureBox控件的MouseUp事件中,使用GraphicsPath类构建一个路径。然后,使用Region类来设置PictureBox控件的裁剪区域,实现抠图功能。

private GraphicsPath _graphicsPath = new GraphicsPath();
private bool _isMouseDown = false;

// 鼠标按下事件
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
    _isMouseDown = true;
    _graphicsPath = new GraphicsPath();
    _graphicsPath.StartFigure();
}

// 鼠标移动事件
private void pictureBox_MouseMove(object sender, MouseEventArgs e)
{
    if (_isMouseDown)
    {
        _graphicsPath.LineTo(e.Location);
        pictureBox.Invalidate();
    }
}

// 鼠标松开事件
private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
    if (_isMouseDown)
    {
        _isMouseDown = false;
        _graphicsPath.CloseFigure();
        Region region = new Region(_graphicsPath);
        pictureBox.Region = region;
    }
}

// PictureBox控件重绘事件
private void pictureBox_Paint(object sender, PaintEventArgs e)
{
    if (_isMouseDown && pictureBox.Image != null)
    {
        Pen pen = new Pen(Color.Red, 2);
        e.Graphics.DrawPath(pen, _graphicsPath);
    }
}

示例说明

示例一:拖动、缩放图片

在窗体加载完成后,会自动加载一张图片。鼠标按下图片并拖动即可实现图片拖动,使用鼠标滚轮即可实现图片缩放。

示例二:旋转、抠图

在窗体最上方有一个TrackBar控件,可以控制图片旋转角度。选中“抠图”按钮后,可以在图片上进行自由绘制,直到鼠标松开之后,PictureBox控件便会被裁剪为抠图路径所包含的可视区域。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# WinForm制作图片编辑工具(图像拖动、缩放、旋转、抠图) - Python技术站

(1)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#连续任务Task.ContinueWith方法

    下面是关于”C#连续任务Task.ContinueWith方法”的完整攻略。 什么是Task.ContinueWith方法 在C#中,Task.ContinueWith方法用于在一个任务完成后执行一些额外的操作。具体来说,该方法使得一个任务能够与另一个相关的任务链接起来,当前一个任务完成后,可以立即启动与它相关的下一个任务,从而形成一个连续的任务链。 Tas…

    C# 2023年6月6日
    00
  • C# GDI+实现时钟表盘

    C# GDI+实现时钟表盘的攻略如下: 1. 准备工作 首先需要在项目中引入System.Drawing和System.Drawing.Drawing2D命名空间,然后在代码中创建一个PictureBox控件,这个控件将用来显示时钟。 2. 绘制表盘 我们可以先创建一个空白的位图对象,然后在该对象中绘制表盘的外圆、刻度以及数字等元素。这个过程中需要使用到Gr…

    C# 2023年6月1日
    00
  • c#中值类型和引用类型的基础教程

    下面是关于“c#中值类型和引用类型的基础教程”的完整攻略: 概述 在C#中,变量可以分为两种类型:值类型和引用类型。这两种类型在内存中有不同的处理方式,因此在使用时需注意它们之间的差异。 值类型 值类型的变量直接存储其值,这意味着它们被存储在程序的栈中。栈内存是一种自动分配和释放的内存,通常用于存储函数参数和局部变量等短期数据。 C#中有多种内置的值类型,如…

    C# 2023年6月1日
    00
  • C#中lock用法详解

    C#中lock用法详解 什么是lock? 在C#中,lock用于控制多线程访问共享资源的同步。如果一个线程进入到了一个使用lock控制同步的代码块中,那么其他线程将会被阻塞,直到这个线程离开这个代码块为止。 lock的基本使用方式 lock语法的基本形式为: lock (lockObject) { // 处理共享资源的代码 } 其中,lockObject是一…

    C# 2023年5月31日
    00
  • C#实现多个计时器记录不同定时时间

    实现多个计时器可以利用C#中的System.Timers.Timer类来完成。 步骤如下: 创建一个Dictionary<string, Timer>,用于存储多个计时器,其中键为计时器的名称,值为对应的Timer实例。 对于每个需要计时的任务,创建一个计时器并设置定时时间、事件处理程序等参数。 将计时器实例添加到Dictionary中,并指定一…

    C# 2023年6月1日
    00
  • 一文带你吃透C#中面向对象的相关知识

    一文带你吃透C#中面向对象的相关知识 什么是面向对象 面向对象编程是一种编程方法和思想,它的核心是将事物抽象为对象,并通过对象之间的交互来完成任务。在C#中,一切皆为对象,包括类和结构体等用户定义的类型,以及基本类型如int,float等。 类与对象 类是创建对象的模板,它定义了对象的属性和方法。对象是类的实例,它是内存中分配的一块区域,可以存储类的属性值。…

    C# 2023年5月14日
    00
  • C#利用System.Uri转URL为绝对地址的方法

    当我们在编写 C# 程序时,有时需要将相对 URL 转为绝对 URL。这时可以利用 System.Uri 类提供的方法来实现。在本篇攻略中,我将详细讲解如何使用 System.Uri 类来将相对 URL 转为绝对 URL 的方法。 步骤一:创建 Uri 对象 使用 System.Uri 类中的 Parse 方法或者构造函数,将相对 URL 转为 Uri 对象…

    C# 2023年6月7日
    00
  • C#单例模式Singleton的实现详解

    C#单例模式Singleton的实现详解 单例模式是什么? 单例模式是一种创建型设计模式,其主题为确保一个类只有一个实例,并提供全局访问点。 实现单例模式 1. 延迟初始化 实现单例模式的一种简单方法是在实例化对象之前先执行一些操作。 假如我们只需要在调用该对象时才创建该对象,那么我们可以使用以下方式来实现: public class Singleton {…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部