怎么給購(gòu)物網(wǎng)站做推廣網(wǎng)站維護(hù)費(fèi)用
在 C# 中,Graphics
類(lèi)是 System.Drawing
命名空間的一部分,它提供了一組方法和屬性,用于在 Windows Forms 應(yīng)用程序中進(jìn)行二維繪圖。Graphics
對(duì)象可以繪制文本、線條、曲線、形狀和圖像,并可以對(duì)它們進(jìn)行變換和剪輯。
Graphics
類(lèi)的一些常用功能和方法:?
1.繪制線條:
DrawLine(Pen pen, int x1, int y1, int x2, int y2)
:使用指定的?Pen
?對(duì)象繪制直線。
DrawLines(Pen pen, Point[] points)
:使用指定的?Pen
?對(duì)象和點(diǎn)數(shù)組繪制一系列連續(xù)的線條。
public Form1()
{InitializeComponent();this.panel1.Paint += Panel1_Paint;this.panel2.Paint += Panel2_Paint;
}
//DrawLine(Pen pen, int x1, int y1, int x2, int y2)
private void Panel1_Paint(object sender, PaintEventArgs e)
{//1.創(chuàng)建圖形(畫(huà)布,畫(huà)板)Graphics g = e.Graphics;//2.設(shè)置繪制參數(shù)()SetQuality(g);//3.開(kāi)始繪制Pen pen = new Pen(Color.Red, 10F);Point pt1 = new Point(50, 50);Point pt2 = new Point(100, 50);g.DrawLine(pen, pt1, pt2);//注意:起點(diǎn)的坐標(biāo),考慮畫(huà)筆的寬度Pen pen1 = new Pen(Color.Blue, 10F);Point pt3 = new Point(100 + 5, 50 - 5);Point pt4 = new Point(100 + 5, 100);g.DrawLine(pen1, pt3, pt4);
}
//DrawLines(Pen pen, Point[] points)
private void Panel1_Paint(object sender, PaintEventArgs e)
{Pen pen = new Pen(Color.Red, 10F);Point[] points = new Point[]{new Point(80,150),new Point(80,20),new Point(20,100),new Point(120,100),};g.DrawLines(pen, points);
}
2.繪制形狀:?
DrawRectangle(Pen pen, int x, int y, int width, int height)
:使用指定的?Pen
?對(duì)象繪制矩形。
DrawEllipse(Pen pen, int x, int y, int width, int height)
:使用指定的?Pen
?對(duì)象繪制橢圓。
DrawPolygon(Pen pen, Point[] points)
:使用指定的?Pen
?對(duì)象和點(diǎn)數(shù)組繪制多邊形。
public Form1()
{InitializeComponent();this.panel1.Paint += Panel1_Paint;this.panel2.Paint += Panel2_Paint;this.panel3.Paint += Panel3_Paint;
}
//矩形DrawRectangle(Pen pen, int x, int y, int width, int height)
private void Panel1_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Rectangle rect = new Rectangle(20,20,100,100);g.DrawRectangle(pen1, rect);
}
//橢圓DrawEllipse(Pen pen, int x, int y, int width, int height)
private void Panel2_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Rectangle rect = new Rectangle(20,20,80,100);g.DrawEllipse(pen1, rect);//橢圓
}
//多邊形DrawPolygon(Pen pen, Point[] points)
private void Panel3_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Point[] points = new Point[]{new Point(80,20),new Point(20,100),new Point(120,100),};g.DrawPolygon(pen1, points);
}
?3.填充形狀:
FillRectangle(Brush brush, int x, int y, int width, int height)
:使用指定的?Brush
?對(duì)象填充矩形。
FillEllipse(Brush brush, int x, int y, int width, int height)
:使用指定的?Brush
?對(duì)象填充橢圓。
FillPolygon(Brush brush, Point[] points)
:使用指定的?Brush
?對(duì)象填充多邊形。
public Form1()
{InitializeComponent();this.panel1.Paint += Panel1_Paint;this.panel2.Paint += Panel2_Paint;this.panel3.Paint += Panel3_Paint;
}
//FillRectangle(Brush brush, int x, int y, int width, int height)
private void Panel1_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Rectangle rect = new Rectangle(20,20,100,100);Brush brush = new SolidBrush(Color.Yellow);g.FillRectangle(brush, rect);g.DrawRectangle(pen1, rect);//矩形
}
//FillEllipse(Brush brush, int x, int y, int width, int height)
private void Panel2_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Rectangle rect = new Rectangle(20,20,80,100);Brush brush = new SolidBrush(Color.Yellow);g.FillEllipse(brush, rect);g.DrawEllipse(pen1, rect);//橢圓
}
//FillPolygon(Brush brush, Point[] points)
private void Panel3_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);Pen pen1 = new Pen(Color.Red, 10F);Point[] points = new Point[]{new Point(80,20),new Point(20,100),new Point(120,100),};Brush brush = new SolidBrush(Color.Yellow);g.DrawPolygon(pen1, points);g.FillPolygon(brush,points);
}
4.繪制文本:?
DrawString(String s, Font font, Brush brush, float x, float y)
:在指定位置繪制文本字符串。
public Form1()
{InitializeComponent();this.panel1.Paint += Panel1_Paint;
}private void Panel1_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;SetQuality(g);string s = "相尋夢(mèng)里路,飛雨落花中";Font font = new Font("華文琥珀",20F);Brush brush = new SolidBrush(Color.Pink);g.DrawString(s,font,brush,10,10);}
5.圖像處理:
DrawImage(Image image, Point point)
:在指定位置繪制圖像。
DrawImage(Image image, Rectangle rect)
:在指定矩形區(qū)域內(nèi)繪制圖像。
public Form1()
{InitializeComponent();this.panel1.Paint += Panel1_Paint;this.panel1.Paint += Panel2_Paint;
}
private void Panel1_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/1.png");Image img = Image.FromFile(path);Point point = new Point( 0, 0);g.DrawImage(img, point);//在指定位置繪制圖像img.Dispose(); // 釋放圖像資源
}
private void Panel2_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/2.png");Image img = Image.FromFile(path);Rectangle rect = new Rectangle(0,0,300,240);g.DrawImage(img, rect);img.Dispose(); // 釋放圖像資源
}
?
6.變換和剪輯:?
TranslateTransform(float dx, float dy)
:對(duì)當(dāng)前的坐標(biāo)系統(tǒng)進(jìn)行平移變換。
ScaleTransform(float sx, float sy)
:對(duì)當(dāng)前的坐標(biāo)系統(tǒng)進(jìn)行縮放變換。
RotateTransform(float angle)
:對(duì)當(dāng)前的坐標(biāo)系統(tǒng)進(jìn)行旋轉(zhuǎn)變換。
SetClip(Rectangle rect)
:設(shè)置當(dāng)前的剪輯區(qū)域。
代碼在下面
1.平移變換? ? ? ? ? ? ? ? ? ? ? ? ?2.縮放變換????????????????????????3.?旋轉(zhuǎn)變換? ? ? ? ?
?
?7.獲取信息:
VisibleClipBounds
:獲取當(dāng)前剪輯區(qū)域的邊界。
IsVisible(Point point)
:判斷一個(gè)點(diǎn)是否在可見(jiàn)區(qū)域內(nèi)。
代碼
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Windows.Forms;
namespace 圖形變換和剪輯
{public partial class Form1 : Form{public Form1(){InitializeComponent();Panel panel1 = new Panel{Size = new Size(400, 400),Location = new Point(50, 50),BackColor = Color.Green,};this.Controls.Add(panel1);panel1.Paint += Panel1_Paint; 平移變換panel1.Paint += Panel2_Paint; // 縮放變換panel1.Paint += Panel3_Paint; // 旋轉(zhuǎn)變換panel1.Paint += Panel4_Paint; // 設(shè)置剪輯區(qū)域}private void Panel1_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/1.png");Image img = Image.FromFile(path);g.TranslateTransform(100, 0);g.DrawImage(img, new Point(0,0));}private void Panel2_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/1.png");Image img = Image.FromFile(path);g.ScaleTransform(1.5F,1.5F);//縮放g.DrawImage(img, new Point(-100, -100));}private void Panel3_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/1.png");Image img = Image.FromFile(path);g.RotateTransform(45); // 旋轉(zhuǎn)變換g.DrawImage(img, new Point(0, 0));}private void Panel4_Paint(object sender, PaintEventArgs e){Graphics g = e.Graphics;SetQuality(g);string path = Path.Combine(Environment.CurrentDirectory, "../../image/2.png");Image img = Image.FromFile(path);Rectangle clipRect = new Rectangle(50, 50, 300, 300);g.SetClip(clipRect);//設(shè)置當(dāng)前編輯區(qū)// 獲取信息RectangleF visibleClipBounds = g.VisibleClipBounds;Console.WriteLine($"Visible Clip Bounds: {visibleClipBounds}");Point testPoint = new Point(100, 100);bool isVisible = g.IsVisible(testPoint);Console.WriteLine($"Point {testPoint} is visible: {isVisible}");}private static void SetQuality(Graphics g){g.SmoothingMode = SmoothingMode.AntiAlias;g.CompositingQuality = CompositingQuality.HighQuality;g.InterpolationMode = InterpolationMode.HighQualityBicubic;}}
}
SetQuality()
SetQuality
方法是一個(gè)自定義方法,它不是 System.Drawing
命名空間的一部分。這個(gè)方法通常用于設(shè)置 Graphics
對(duì)象的屬性,以提高繪制質(zhì)量,特別是在進(jìn)行圖形變換、繪制文本或圖像時(shí)。
SetQuality
方法設(shè)置了以下幾個(gè)關(guān)鍵屬性:
SmoothingMode
:設(shè)置為?SmoothingMode.AntiAlias
,以啟用抗鋸齒,使線條和曲線更平滑。InterpolationMode
:設(shè)置為?InterpolationMode.HighQualityBicubic
,以在圖像縮放時(shí)使用高質(zhì)量的雙三次插值算法。PixelOffsetMode
:設(shè)置為?PixelOffsetMode.HighQuality
,以減少圖像旋轉(zhuǎn)和大字體文本時(shí)的像素偏移。TextRenderingHint
:設(shè)置為?TextRenderingHint.AntiAliasGridFit
,以提高文本渲染的質(zhì)量和清晰度。CompositingQuality
:設(shè)置為?CompositingQuality.HighQuality
,以確保在合成圖像時(shí)使用高質(zhì)量的算法。
using System.Drawing;
using System.Drawing.Drawing2D;
public void SetQuality(Graphics g)
{// 設(shè)置高質(zhì)量渲染模式g.SmoothingMode = SmoothingMode.AntiAlias; // 抗鋸齒// 設(shè)置高質(zhì)量的插值模式g.InterpolationMode = InterpolationMode.HighQualityBicubic; // 高質(zhì)量雙三次插值// 設(shè)置高質(zhì)量的像素偏移模式g.PixelOffsetMode = PixelOffsetMode.HighQuality; // 高質(zhì)量像素偏移// 設(shè)置高質(zhì)量的路徑漸變g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; // 文本抗鋸齒// 設(shè)置圖形對(duì)象的線性變換和旋轉(zhuǎn)變換的精度g.CompositingQuality = CompositingQuality.HighQuality; // 高質(zhì)量合成
}// 在 Paint 事件處理程序中使用 SetQuality 方法
private void MyControl_Paint(object sender, PaintEventArgs e)
{Graphics g = e.Graphics;SetQuality(g); // 應(yīng)用高質(zhì)量設(shè)置// 現(xiàn)在使用 g 繪制文本、線條、形狀等g.DrawString("Hello, World!", new Font("Arial", 16), Brushes.Black, new PointF(10, 10));
}