iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在c#中使用WinForm制作一个图片编辑工具
  • 474
分享到

怎么在c#中使用WinForm制作一个图片编辑工具

2023-06-07 23:06:21 474人浏览 泡泡鱼
摘要

今天就跟大家聊聊有关怎么在C#中使用winform制作一个图片编辑工具,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1 功能介绍程序主界面点击打开图片,可选择多个图片文件。图片缩略图

今天就跟大家聊聊有关怎么在C#中使用winform制作一个图片编辑工具,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

1 功能介绍

程序主界面

怎么在c#中使用WinForm制作一个图片编辑工具

点击打开图片,可选择多个图片文件。图片缩略图左侧显示,双击左侧图片,添加到编辑区。

图片编辑区分为:纸张区域和打印区域。图片只能在打印区编辑。当选中这两个区,可调整各个区的大小。

 主要功能点:

1 拖动:选中图片后,可以任意拖动图片。

怎么在c#中使用WinForm制作一个图片编辑工具

2 缩放:可对图片左右上下实现缩放。可以定显示比例缩放。

怎么在c#中使用WinForm制作一个图片编辑工具

3 旋转,可以选择旋转基点再旋转。如果不选择旋转基点,以对角为基点旋转。

怎么在c#中使用WinForm制作一个图片编辑工具

怎么在c#中使用WinForm制作一个图片编辑工具

4 抠图

怎么在c#中使用WinForm制作一个图片编辑工具

5 其他一些操作

当有多个图片相互覆盖时,可以调整图层。

选中一个图片后,可以对图片的位置、大小、旋转角度调整。

选择保存,会将编辑的图片保存为文件。

2 处理思路

  图片编辑信息 每个图像都有对应的变量记录该图像的详细,比如位置、尺寸、旋转角度、剪切区域。见下面代码:

public class ImageProperty { public string Name { get; set; } public Image EditImage { get; set; } //原始图片 public int ActualWidth => EditImage.Width; //实际尺寸 public int ActualHeight => EditImage.Height; public bool ShowImageTip { get; set; } = true; public bool LockSizeRate { get; set; } //比例是否锁定 public Size DrawSize { get; set; } //显示尺寸 public object Tag { get; set; } } public class ImageEditInfo { public ImageProperty ImageProperty { get; set; } public Point Location { get; set; } = new Point(0, 0); //相对于打印区的位置 public Point LocationTopRight => new Point(Location.X + Width, Location.Y); public Point LocationBottomRight => new Point(Location.X + Width, Location.Y + Height); public Point LocationBottomLeft => new Point(Location.X, Location.Y + Height); public int RightX => Location.X + Width; public int ButtomY => Location.Y + Height; public Size DrawSize { get { return ImageProperty.DrawSize; } set { ImageProperty.DrawSize = value; } } public Image Image => ImageProperty.EditImage; public float RotateAngle { get; set; } = 0; //旋转角度 public bool IsSelect { get; set; } public bool LockSizeRate //显示比例是否锁定 { get { return ImageProperty.LockSizeRate; } set { ImageProperty.LockSizeRate = value; } } public int Width { get { return DrawSize.Width; } set { ImageProperty.DrawSize = new Size(value, DrawSize.Height); } } public int Height { get { return DrawSize.Height; } set { ImageProperty.DrawSize = new Size(DrawSize.Width, value); } } public bool ShowImageTip { get { return ImageProperty.ShowImageTip; } set { ImageProperty.ShowImageTip = value; } }  public Point? RotatioBasePoint { get; set; } //旋转基点 public Point RotatioBasePointValue => RotatioBasePoint.Value; public bool HasRotatioBasePoint => (RotatioBasePoint != null && RotatioBasePoint.HasValue);}

图片旋转

对正常的图片移动、缩放并不难。只要调整图像的长宽、位置就行,基本就是加法减法计算。如果图片有旋转,计算起来就麻烦。比如判断鼠标是否点击了图片、鼠标缩放等,实现这些操作都麻烦。

比如判断鼠标是否点击了图片,如果一个图片是斜的(旋转后的),如何处理?我的思路是旋转:将图片和鼠标所在的点都反向旋转;此后,判断逻辑就和常规方法一样了。旋转函数如下:

/// <summary> /// pointMove相对于removeAt,以一定角度旋转 /// </summary> /// <param name="pointMove"></param> /// <param name="removeAt"></param> /// <param name="rotateAngle"></param> /// <param name="clockwise"></param> /// <returns></returns> public static Point RotationAt(Point pointMove, Point removeAt, double rotateAngle, bool clockwise) { if (rotateAngle == 0) return pointMove; lock (matrix) { matrix.Reset(); matrix.Rotate((float)(clockwise ? rotateAngle : -rotateAngle)); Point pt2 = new Point(pointMove.X - removeAt.X, pointMove.Y - removeAt.Y); Point[] pts = new Point[] { new Point(pt2.X, pt2.Y) }; matrix.TransfORMPoints(pts); Point result = new Point(pts[0].X + removeAt.X, pts[0].Y + removeAt.Y); return result; } } internal EN_LinePart MouseMove_HitTest(Point pt) { //鼠标位置 反向旋转, pt = DrawHelper.RotationAt(pt, Location, RotateAngle, false); //下面就是 和正常判断逻辑一样 EN_LinePart result = MouseMove_HitTest_Corner(pt); if (result != EN_LinePart.无) return result;}

画图:

对图片相关参数修改后,需要调用refresh,强制重画。调用GDI+。根据图片在列表的顺序调用(也就是根据图层)。调用时,根据设定显示区域,旋转角度等,做变换后再画。

void DrawWithRotation(Graphics g, bool saveToFile) { //设置质量 ImageHelper.SetHighQuality(g); //置背景色 if (!saveToFile) g.Clear(BackgroundColor); ImageEditInfo selectImage = null; foreach (ImageEditInfo imageInfo in ImageGroup.ListImageToDraw) { //画图片 if (imageInfo.IsSelect) {  Debug.Assert(selectImage == null);  selectImage = imageInfo; } g.TranslateTransform(imageInfo.Location.X, imageInfo.Location.Y); g.RotateTransform(imageInfo.RotateAngle); //是否需要画 抠图 Image imageToDraw = imageInfo.Image; if (imageInfo.CutStat == ImageCutStat.have_cut  && imageInfo.CutPoints.Count > 2) {  Bitmap bitmap = imageToDraw as Bitmap;  System.windows.Point[] points = imageInfo.CutPoints.Select(o => new System.Windows.Point(o.X,o.Y)).ToArray();  Bitmap cutBitmap = ImageCutout.GetImage(bitmap, points);  imageToDraw = cutBitmap; } g.DrawImage(imageToDraw,  new Rectangle(0, 0, imageInfo.DrawSize.Width, imageInfo.DrawSize.Height),  new Rectangle(0, 0, imageInfo.Image.Width, imageInfo.Image.Height),  GraphicsUnit.Pixel); //画旋转基点 if (!saveToFile && imageInfo.HasRotatioBasePoint) {  Point pt = imageInfo.RotatioBasePointValue;  g.FillEllipse(RotatioBaseBrush, pt.X - RotatioBaseRadius, pt.Y - RotatioBaseRadius, RotatioBaseRadius * 2, RotatioBaseRadius * 2); } //显示信息 if (!saveToFile && imageInfo.ShowImageTip) {   ImageProperty ImageProperty = imageInfo.ImageProperty;  string info = string.Format($"({imageInfo.Location.X},{imageInfo.Location.Y}) ({ImageProperty.ActualWidth}X{ImageProperty.ActualHeight}--{imageInfo.DrawSize.Width}X{imageInfo.DrawSize.Height}) (∠{imageInfo.RotateAngle.ToString("0.00")})");  SizeF sizeF = g.MeasureString(info, _drawProperty.TxtFont);  g.FillRectangle(_drawProperty.TxtBackgroundBrush,  new RectangleF(new Point(), sizeF));  g.DrawString(info, _drawProperty.TxtFont, _drawProperty.TxtBrush, new Point()); } //画抠图线 if(!saveToFile  && imageInfo.CutStat == ImageCutStat.in_cuting  && imageInfo.CutPoints.Count>1) {  for(int i=1;i< imageInfo.CutPoints.Count;i++ )  {  g.DrawLine(SelectBorderPen, imageInfo.ToDestImage(imageInfo.CutPoints[i-1]),  imageInfo.ToDestImage(imageInfo.CutPoints[i]));  }  if(imageInfo.CutPoints.Count > 2)  {  g.DrawLine(SelectBorderPen, imageInfo.ToDestImage(imageInfo.CutPoints.First()),  imageInfo.ToDestImage(imageInfo.CutPoints.Last()));  } } g.ResetTransform(); } //画选中状态  if (!saveToFile && selectImage != null) { DrawSelectImageWithRotation(g, selectImage); } }

看完上述内容,你们对怎么在c#中使用WinForm制作一个图片编辑工具有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: 怎么在c#中使用WinForm制作一个图片编辑工具

本文链接: https://www.lsjlt.com/news/250470.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在c#中使用WinForm制作一个图片编辑工具
    今天就跟大家聊聊有关怎么在c#中使用WinForm制作一个图片编辑工具,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1 功能介绍程序主界面点击打开图片,可选择多个图片文件。图片缩略图...
    99+
    2023-06-07
  • 怎么在c#中使用winform制作一个音乐播放器
    这篇文章将为大家详细讲解有关怎么在c#中使用winform制作一个音乐播放器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。AxWindowsMediaPlayer的方法1 首先新建一个页面 ...
    99+
    2023-06-14
  • 怎么用python编写一个图片拼接工具
    本文小编为大家详细介绍“怎么用python编写一个图片拼接工具”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用python编写一个图片拼接工具”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。代码展示这里写了两...
    99+
    2023-06-28
  • 使用Java编写一个图片word互转工具
    目录前言实现方法使用前言 前段时间一直使用到word文档转pdf或者pdf转word,寻思着用Java应该是可以实现的,于是花了点时间写了个文件转换工具 源码weloe/FileCo...
    99+
    2023-01-10
    图片word互转工具 PDF Word文件转换工具 java图片word互转
  • 怎么在python中利用tkinter制作一个倒计时工具
    怎么在python中利用tkinter制作一个倒计时工具?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python的五大特点是什么python的五大特点:1.简...
    99+
    2023-06-14
  • VB.NET中怎么制作一个图片按钮
    VB.NET中怎么制作一个图片按钮,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。VB.NET制作图片按钮思路:很简单,就是在一个picturebox控件上放置一个button控...
    99+
    2023-06-17
  • 使用Python怎么制作一个信息轰炸工具
    本篇文章给大家分享的是有关使用Python怎么制作一个信息轰炸工具,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。准备阶段我们需要安装pyautogui调用库(在命令提示符下安装...
    99+
    2023-06-15
  • 怎么使用Python和ChatGPT制作一个AI实用工具
    本篇内容介绍了“怎么使用Python和ChatGPT制作一个AI实用工具”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!注册OpenAI首先需...
    99+
    2023-07-05
  • C#中怎么利用WinForm控件实现一个下拉式属性编辑器
    这篇文章将为大家详细讲解有关C#中怎么利用WinForm控件实现一个下拉式属性编辑器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先我们要创建一个用于编辑属性的控件,在本系列文章的开始,我...
    99+
    2023-06-17
  • Python中怎么制作一个图片验证码
    这篇文章给大家介绍Python中怎么制作一个图片验证码,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Pillow库Pillow是一个非常强大的图片处理模块,其中Image是Pillow中最为重要的类,实现了Pillow...
    99+
    2023-06-16
  • Android中怎么实现一个图片切割工具类
    Android中怎么实现一个图片切割工具类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。图片切割工具类定义:public class ImageSpli...
    99+
    2023-05-30
    android
  • 怎么用PyQT5制作一个桌面摸鱼工具
    这篇文章主要介绍“怎么用PyQT5制作一个桌面摸鱼工具”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用PyQT5制作一个桌面摸鱼工具”文章能帮助大家解决问题。按键功能控制q 退出B 书签功能F ...
    99+
    2023-06-29
  • 在报表工具中怎么使用echarts绘制地图
    本篇内容主要讲解“在报表工具中怎么使用echarts绘制地图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在报表工具中怎么使用echarts绘制地图”吧!1、数据准备连接数据源,新建报表,增加数...
    99+
    2023-06-04
  • 怎么用Python制作一个文件去重小工具
    这篇文章主要讲解了“怎么用Python制作一个文件去重小工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python制作一个文件去重小工具”吧!前言常常在下载网络素材时有很多的重复文...
    99+
    2023-06-29
  • 怎么用CSS和JS打造一个简单的图片编辑器
    本篇内容介绍了“怎么用CSS和JS打造一个简单的图片编辑器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • linux中怎么使用Arduino制作一个绘图仪
    这篇文章主要介绍了linux中怎么使用Arduino制作一个绘图仪,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。由于我是一个很怀旧的人,我真的很喜欢最初的 Arduino U...
    99+
    2023-06-16
  • 怎么用Python+Tkinter制作在线个性签名工具
    今天小编给大家分享一下怎么用Python+Tkinter制作在线个性签名工具的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。思...
    99+
    2023-06-29
  • 怎么在css中利用Flex制作一个柱状图
    怎么在css中利用Flex制作一个柱状图?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。HTML:<div class="his_box...
    99+
    2023-06-08
  • linux怎么使用heredoc作为一个文本编辑器
    这篇文章主要介绍了linux怎么使用heredoc作为一个文本编辑器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在 Linux 和 Unix 的 shell 中有一个不为人...
    99+
    2023-06-15
  • 怎么用Python制作一个数据预处理小工具
    这篇文章主要讲解了“怎么用Python制作一个数据预处理小工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python制作一个数据预处理小工具”吧!在我们平常使用Python进行数据...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作