C#中GDI+绘制圆弧及圆角矩形等比缩放的绘制

目录
  • 理解圆弧绘制
  • 从圆弧到绘制圆角长方体
  • 如何实现等比缩放绘制圆角矩形
    • 按固定比例计算缩放矩形的尝试(不推荐)
    • 通过Inflate()方法缩放矩形

理解圆弧绘制

GDI+中对于圆弧的绘制,是以给定的长方形(System.Drawing.Rectangle 结构)为边界绘制的椭圆的一部分形成的圆弧。绘制的圆弧的中心为长方形内切椭圆的圆心(如果是正方形,则正方形的中心是内切圆的圆心)

Graphics对象的DrawArc()方法用于绘制圆弧线段;GraphicsPath对象的AddArc()方法用于绘制圆弧路径。

DrawArc为例,参数为:DrawArc (System.Drawing.Pen pen, System.Drawing.Rectangle rect, float startAngle, float sweepAngle),绘制一段弧线,它表示 Rectangle 结构指定的椭圆的一部分。

  • pen 为画笔对象。
  • rect 包含圆弧的长方体结构。
  • startAngle 圆弧绘制的开始角度。
  • sweepAngle 从 startAngle 角度到弧线的结束点沿顺时针方向度量的角(以度为单位),即从startAngle开始绘制弧线转动的角度。

新建Winform项目GDIForArc,测试和演示弧形绘制的效果。

直接看下面的代码,分别绘制矩形对应的四个角的弧形(1/4圆),可以很直观的看到圆弧的绘制及与长方体的关系:

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;
    Pen pn = new Pen(Color.Blue,5);
    Rectangle rect = new Rectangle(50, 50, 150, 150);
    g.DrawRectangle(pn, rect);

    Rectangle rect2 = new Rectangle(300, 50, 150, 350);
    g.DrawRectangle(pn, rect2);

    // 红色 0-90deg的圆弧
    pn.Color = RedColor;
    g.DrawArc(pn, rect, 0, 90);

    g.DrawArc(pn, rect2, 0, 90);

    // 黑色 90-180deg的圆弧
    pn.Color = BalckColor;
    g.DrawArc(pn, rect, 90, 90);

    g.DrawArc(pn, rect2, 90, 90);

    // 绿色 180-270deg的圆弧
    pn.Color = GreenColor;
    g.DrawArc(pn, rect, 180, 90);

    g.DrawArc(pn, rect2, 180, 90);

    // 粉色 270-360deg的圆弧
    pn.Color = HotPink;
    g.DrawArc(pn, rect, 270, 90);

    g.DrawArc(pn, rect2, 270, 90);
}

从圆弧到绘制圆角长方体

GDI+中绘图系统中顺时针方向为旋转正方向,水平向右方向为x轴正方向,垂直向下为y轴正方向。

通过Rectangle结构内的四个圆弧,可以组合成四个圆角,从而可以进一步实现圆角长方体、圆形等图形。

如下,是使用这个方式绘制的圆角矩形。

需要注意的点:

  • 线条连接时的1像素问题,很多时候会出现1像素的间隔,并没有完全闭合连接,需要额外处理
  • Pen.LineJoin 指定线条连接点的模式
// 绘制圆角矩形
pn.Color = Color.MediumVioletRed;
// 指定连接处的连接点
pn.LineJoin = LineJoin.Round;

Rectangle roundRect = new Rectangle(500, 50, 150, 80);
var radius = 20;
var R = radius * 2;
Rectangle arcRect = new Rectangle(roundRect.X, roundRect.Y, R, R);

// 左上角
g.DrawArc(pn, arcRect, 180, 90);
// 右上角
arcRect.X = roundRect.Right - R;
g.DrawArc(pn, arcRect, 270, 90);
// 右下角
arcRect.Y = roundRect.Bottom - R;
g.DrawArc(pn, arcRect, 0, 90);
// 左下角
arcRect.X = roundRect.Left;
g.DrawArc(pn, arcRect, 90, 90);

#region 单独绘制线条,需要处理1像素间隔问题,且连接处不平滑
g.DrawLine(pn, roundRect.X + radius, roundRect.Y, roundRect.Right - radius + 1, roundRect.Y);

g.DrawLine(pn, roundRect.Right, roundRect.Y + radius, roundRect.Right, roundRect.Bottom - radius + 1);

g.DrawLine(pn, roundRect.Right - radius + 1, roundRect.Bottom, roundRect.Left + radius, roundRect.Bottom);

g.DrawLine(pn, roundRect.Left, roundRect.Bottom - radius + 1, roundRect.Left, roundRect.Y + radius);
#endregion

如何实现等比缩放绘制圆角矩形

按固定比例计算缩放矩形的尝试(不推荐)

根据上面绘制矩形的思路,想着同样实现一个按照等比缩放绘制内部圆角矩形的方式。主要思路是,指定一个缩放比例,让外部的矩形宽高、位置、圆角绘制的半径、直径等对应等比缩放并计算其值。

然后就是圆角矩形的绘制思路。

#region 等比缩放的绘制圆角矩形
//// 等比缩放,绘制内层圆角矩形
var scale = 0.8f;
var radiusScale = radius * scale;
var RScale = radiusScale * 2;
var innerRoundRect = new RectangleF(roundRect.X + (roundRect.Width - roundRect.Width * scale) / 2, roundRect.Y + (roundRect.Height - roundRect.Height * scale) / 2, roundRect.Width * scale, roundRect.Height * scale);
var arcRectScale = new RectangleF(innerRoundRect.X, innerRoundRect.Y, RScale, RScale);
//var scale = 0.8f;
//var radiusScale = Convert.ToInt32(radius * scale);
//var RScale = radiusScale * 2;
//var width = Convert.ToInt32(roundRect.Width * scale);
//var height = Convert.ToInt32(roundRect.Height * scale);
//var innerRoundRect = new Rectangle(roundRect.X + (roundRect.Width - width) / 2, roundRect.Y + (roundRect.Height - height) / 2, width, height);
//var arcRectScale = new Rectangle(innerRoundRect.X, innerRoundRect.Y, RScale, RScale);

pn.Color = Color.MediumPurple;
arcRectScale.X = innerRoundRect.X;
arcRectScale.Y = innerRoundRect.Y;

// 左上角
g.DrawArc(pn, arcRectScale, 180, 90);
g.DrawLine(pn, innerRoundRect.X + radiusScale, innerRoundRect.Y, innerRoundRect.Right - radiusScale + 1, innerRoundRect.Y);
// 右上角
arcRectScale.X = innerRoundRect.Right - RScale;
g.DrawArc(pn, arcRectScale, 270, 90);
g.DrawLine(pn, innerRoundRect.Right, innerRoundRect.Y + radiusScale, innerRoundRect.Right, innerRoundRect.Bottom - radiusScale + 1);
// 右下角
arcRectScale.Y = innerRoundRect.Bottom - RScale;
g.DrawArc(pn, arcRectScale, 0, 90);
g.DrawLine(pn, innerRoundRect.Right - radiusScale + 1, innerRoundRect.Bottom, innerRoundRect.Left + radiusScale, innerRoundRect.Bottom);
// 左下角
arcRectScale.X = innerRoundRect.Left;
g.DrawArc(pn, arcRectScale, 90, 90);
g.DrawLine(pn, innerRoundRect.Left, innerRoundRect.Bottom - radiusScale + 1, innerRoundRect.Left, innerRoundRect.Y + radiusScale);
#endregion

去掉外层圆角矩形的直线,效果如下:

直接计算比例的问题在于,由于矩形长宽大小的不同,计算出来内部(或外部)矩形的缩小或增大的量会不同,原则上,应该是长宽方向上缩小固定的量(类似边框在长宽方向时,边框的大小都是一样的)。因此,最好取其中一个值。

缩小或增大的矩形的圆角半径是否应该对应缩放?这是一直没有很好处理的问题,如果缩小放大的变化不大,则没有太大区别,如果比较大,圆角半径最好保持不变(上例代码为圆角半径也跟着缩放的例子)

通过Inflate()方法缩放矩形

Inflate()可分为实例方法和静态方法,它是专门用于缩放矩形的长宽指定的量的方法,而不是长宽不对等的比例计算。

推荐使用它加上圆角半径不变的方式,计算内层或外层圆角矩形。

Inflate的使用代码如下,其他不变的代码部分不再列出。

var inflateRect = Rectangle.Inflate(roundRect, -8, -8);
// inflateRect.Inflate(-8, -8); // 实例方法,长宽缩小或放大指定的量,改变的实例本身

// others

到此这篇关于C#中GDI+绘制圆弧及圆角矩形等比缩放的绘制的文章就介绍到这了,更多相关C# GDI 绘制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

    效果图: 完全代码(下方有详细解读) private void textBox1_TextChanged(object sender, EventArgs e) {//这里是文本框的事件 值发生 改变时发生 StringBuilder UserID = new StringBuilder(20); //值经常发生改变 使用StringBuilder 并且开辟20字符的空间 Regex r = new Regex(@"[\d]"); //正则表达式 过滤字符 \d表示只要0-9的数字 /

  • 深入C# winform清除由GDI绘制出来的所有线条或图形的解决方法

    在C#winform应用程序中,可以用GDI绘制出线条或图形.1.在主窗体上绘制线条或图形 复制代码 代码如下: using (Graphics g = this.CreateGraphics())      {            g.DrawLine(Pens.Blue, new Point(10, 10), new Point(100, 100));      } 2.在指定的容器上绘制线条或图形,如在panel1上绘制 复制代码 代码如下: using (Graphics g = th

  • C# 使用GDI绘制雷达图的实例

    最近项目要用C#实现画一个雷达图,搜了搜网上竟然找不到C#画雷达图的解决方案,那么自己实现一个吧 实现效果如下图: 代码如下: public static class RadarDemo { static float mW = 1200; static float mH = 1200; static Dictionary<string, float> mData = new Dictionary<string, float> { //{ "速度",77}, {

  • C#利用GDI+绘制旋转文字等效果实例

    本文实例讲述了C#利用GDI+绘制旋转文字等效果的方法,是非常实用的技巧.分享给大家供大家参考之用.具体如下: C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经过不少的计算过程.利用下面的类可以实现该功能. 具体实现代码如下: using System; using System.Collections.Generic; using System

  • C#利用GDI绘制常见图形和文字

    废话不多说,我们先来认识一下这个GDI+,看看它到底长什么样. GDI+:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能;在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用DirectX处理三维(3D)的图形图像,图形图像处理用到的主要命名空间是System . Drawing:提供了对GDI+基本图形功能的访问,主要有Graphics类.Bitmap类.从Brush类继承的类.Font类.Icon类.Image类.

  • C#使用GDI绘制直线的方法

    本文实例讲述了C#使用GDI绘制直线的方法.分享给大家供大家参考.具体实现方法如下: Point p1=new Point(200,200); Point p2=new Point(300,100); Pen p=new Pen(Color.Black); Graphics g = CreateGraphics(); g.DrawLine(p,p1,p2); 希望本文所述对大家的C#程序设计有所帮助.

  • C#使用GDI绘制矩形的方法

    本文实例讲述了C#使用GDI绘制矩形的方法.分享给大家供大家参考.具体实现方法如下: Pen p = new Pen(Color.Black,2); Graphics g = CreateGraphics(); g.DrawRectangle(p,200,200,100,100); 希望本文所述对大家的C#程序设计有所帮助.

  • C#中GDI+绘制圆弧及圆角矩形等比缩放的绘制

    目录 理解圆弧绘制 从圆弧到绘制圆角长方体 如何实现等比缩放绘制圆角矩形 按固定比例计算缩放矩形的尝试(不推荐) 通过Inflate()方法缩放矩形 理解圆弧绘制 GDI+中对于圆弧的绘制,是以给定的长方形(System.Drawing.Rectangle 结构)为边界绘制的椭圆的一部分形成的圆弧.绘制的圆弧的中心为长方形内切椭圆的圆心(如果是正方形,则正方形的中心是内切圆的圆心) Graphics对象的DrawArc()方法用于绘制圆弧线段:GraphicsPath对象的AddArc()方法用

  • C语言编程使用MATLAB绘制椭圆及圆角矩形

    目录 1 程序说明 椭圆形: 心形: 2 完整代码 不能放图,大家自行绘制试试看. 1 程序说明 这个程序就是用一系列椭圆,圆角矩形及心形拼在起,以下说明一下各部分怎么生成: 椭圆形: 椭圆形是用的如下椭圆数据生成函数生成数据点,之后再用fill函数绘制而成,其中Mu为椭圆中心点,Sigma为协方差矩阵,S为半径平方,pntNum是生成数据点个数: % 椭圆数据计算函数,输入协方差矩阵.中心点.半径生成椭圆数据 % 椭圆数据计算函数,输入协方差矩阵.中心点.半径生成椭圆数据 function [

  • 易语言在画板中画一个指定样式圆角矩形的方法

    画圆角矩形方法 英文命令:RoundRect 操作系统支持:Windows    所属对象:画板 使用画笔在画板上画出一个圆角矩形,圆角矩形的内部使用刷子填充. 语法:  无返回值  画板.画圆角矩形 (矩形左上角横坐标,矩形左上角纵坐标,矩形右下角横坐标,矩形右下角纵坐标,圆角宽度,[圆角高度]) 例程 说明 通过"画圆角矩形"命令在画板中画一个指定样式的圆角矩形. 运行结果: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我

  • 详解微信小程序canvas圆角矩形的绘制的方法

    微信小程序允许对普通元素通过 border-radius 的设置来进行圆角的绘制,但有时候在使用 canvas 绘图的时候,也需要圆角,例如需要将页面上某块区域导出为图片下载到本地的时候,常用的解决方法就是使用 canvas 将这块区域绘制出来,最后导出 canvas 即可,但是 canvas 没有直接提供圆角的绘制 api ,所以需要 曲线救国 圆角矩形与一般矩形的区别在于,前者的四个角都是圆弧,所以只需要将一般矩形的四个角切掉,换成圆弧即可,如下图就是一个一般矩形被切掉了四个角的样子: 很明

  • Android开发使用自定义View将圆角矩形绘制在Canvas上的方法

    本文实例讲述了Android开发使用自定义View将圆角矩形绘制在Canvas上的方法.分享给大家供大家参考,具体如下: 前几天,公司一个项目中,头像图片需要添加圆角,这样UI效果会更好看,于是写了一个小的demo进行圆角的定义,该处主要是使用BitmapShader进行了渲染(如果要将一张图片裁剪成椭圆或圆形显示在屏幕上,也可以使用BitmapShader来完成). BitmapShader类完成渲染图片的基本步骤如下: 1.创建BitmapShader类的对象 /** * Call this

  • Android编程之canvas绘制各种图形(点,直线,弧,圆,椭圆,文字,矩形,多边形,曲线,圆角矩形)

    本文实例讲述了Android编程之canvas绘制各种图形的方法.分享给大家供大家参考,具体如下: 1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into

  • Android编程开发之在Canvas中利用Path绘制基本图形(圆形,矩形,椭圆,三角形等)

    本文实例讲述了Android编程开发之在Canvas中利用Path绘制基本图形的方法.分享给大家供大家参考,具体如下: 在Android中绘制基本的集合图形,本程序就是自定义一个View组件,程序重写该View组件的onDraw(Canvase)方法,然后在该Canvas上绘制大量的基本的集合图形. 直接上代码: 1.自定义的View组件代码: package com.infy.configuration; import android.content.Context; import andro

  • Android 快速绘制一个圆角矩形的实例

    android 开发过程中,经常需要绘制一些简单的颜色图形.下面贴上一段最简单的图形. 圆角矩形: res\drawable\shape_small_label.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 内部颜色 --> &l

  • OpenCV绘制圆角矩形的方法实例

    功能函数 // 绘制圆角矩形 void DrawRotatedRectChamfer(cv::Mat mask,const cv::RotatedRect rotatedrect, float radius,const cv::Scalar &color, int thickness, int lineType) { // 创建画布 cv::Mat canvas = cv::Mat::zeros(mask.size(), CV_8UC1); cv::RotatedRect newrotatedr

  • Android实现空心圆角矩形按钮的实例代码

    页面上有时会用到背景为空心圆角矩形的Button,可以通过xml绘制出来. drawrable文件夹下bg_red_hollow_rectangle.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle&qu

随机推荐