C#中GDI+编程10个基本技巧二
5、渐变色填充
需要使用两个刷子:
线性梯度刷子(LinearGradientBrush)
路径梯度刷子(PathGuadientBrush)
private void button4_Click(object sender,System.EventArgs e)
{
//绘图表面
Graphics g =this.pictureBoxII1.CreateGraphics();
g.FillRectangle(Brushes.White,this.pictureBoxII1.ClientRectangle);
//定义一个线性梯度刷子
LinearGradientBrush lgbrush =
new LinearGradientBrush(
new Point(0, 10),
new Point(150, 10),
Color.FromArgb(255, 0, 0),
Color.FromArgb(0, 255, 0));
Pen pen = new Pen(lgbrush);
//用线性笔刷梯度效果的笔绘制一条直线段并填充一个矩形
g.DrawLine(pen, 10, 130, 500, 130);
g.FillRectangle(lgbrush, 10, 150, 370, 30);
//定义路径并添加一个椭圆
GraphicsPath gp = new GraphicsPath();
gp.AddEllipse(10, 10, 200, 100);
//用该路径定义路径梯度刷子
PathGradientBrush brush =
new PathGradientBrush(gp);
//颜色数组
Color[] colors = {
Color.FromArgb(255, 0, 0),
Color.FromArgb(100, 100, 100),
Color.FromArgb(0, 255, 0),
Color.FromArgb(0, 0, 255)};
//定义颜色渐变比率
float[] r = {0.0f, 0.3f, 0.6f, 1.0f};
ColorBlend blend = new ColorBlend();
blend.Colors = colors;
blend.Positions = r;
brush.InterpolationColors = blend;
//在椭圆外填充一个矩形
g.FillRectangle(brush, 0, 0, 210, 110);
//用添加了椭圆的路径定义第二个路径梯度刷子
GraphicsPath gp2 = new GraphicsPath();
gp2.AddEllipse(300, 0, 200, 100);
PathGradientBrush brush2 = new PathGradientBrush(gp2);
//设置中心点位置和颜色
brush2.CenterPoint = new PointF(450, 50);
brush2.CenterColor = Color.FromArgb(0, 255, 0);
//设置边界颜色
Color[] color2 = {Color.FromArgb(255, 0, 0)};
brush2.SurroundColors = color2;
//用第二个梯度刷填充椭圆
g.FillEllipse(brush2, 300, 0, 200, 100);
}
6、GDI+的坐标系统
通用坐标系——用户自定义坐标系。
页面坐标系——虚拟坐标系。
设备坐标系——屏幕坐标系。
当页面坐标系和设备坐标系的单位都是象素时,它们相同。
private void button10_Click(object sender, System.EventArgse)
{
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
this.Draw(g);
}
private void Draw(Graphics g)
{
g.DrawLine(Pens.Black, 10, 10, 100, 100);
g.DrawEllipse(Pens.Black, 50, 50, 200, 100);
g.DrawArc(Pens.Black, 100, 10, 100, 100, 20, 160);
g.DrawRectangle(Pens.Green, 50, 200, 150, 100);
}
private void button5_Click(object sender, System.EventArgs e)
{
//左移
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
g.TranslateTransform(-50, 0);
this.Draw(g);
}
private void button6_Click(object sender, System.EventArgs e)
{
//右移
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
g.TranslateTransform(50, 0);
this.Draw(g);
}
private void button7_Click(object sender, System.EventArgs e)
{
//旋转
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
g.RotateTransform(-30);
this.Draw(g);
}
private void button8_Click(object sender, System.EventArgs e)
{
//放大
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
g.ScaleTransform(1.2f, 1.2f);
this.Draw(g);
}
private void button9_Click(object sender, System.EventArgs e)
{
//缩小
Graphics g = this.pictureBoxII1.CreateGraphics();
g.Clear(Color.White);
g.ScaleTransform(0.8f, 0.8f);
this.Draw(g);
}
7、全局坐标——变换对于绘图表面上的每个图元都会产生影响。通常用于设定通用坐标系。
下程序将原定点移动到控件中心,并且Y轴正向朝上。
//先画一个圆
Graphics g = e.Graphics;
g.FillRectangle(Brushes.White, this.ClientRectangle);
g.DrawEllipse(Pens.Black, -100, -100, 200, 200);
//使y轴正向朝上,必须做相对于x轴镜像
//变换矩阵为[1,0,0,-1,0,0]
Matrix mat = new Matrix(1, 0, 0, -1, 0, 0);
g.Transform = mat;
Rectangle rect = this.ClientRectangle;
int w = rect.Width;
int h = rect.Height;
g.TranslateTransform(w/2, -h/2);
//以原点为中心,做一个半径为100的圆
g.DrawEllipse(Pens.Red, -100, -100, 200, 200);
g.TranslateTransform(100, 100);
g.DrawEllipse(Pens.Green, -100, -100, 200, 200);
g.ScaleTransform(2, 2);
g.DrawEllipse(Pens.Blue, -100, -100, 200, 200);
8、局部坐标系——只对某些图形进行变换,而其它图形元素不变。
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
//客户区设置为白色
g.FillRectangle(Brushes.White, this.ClientRectangle);
//y轴朝上
Matrix mat = new Matrix(1, 0, 0, -1, 0, 0);
g.Transform = mat;
//移动坐标原点到窗体中心
Rectangle rect = this.ClientRectangle;
int w = rect.Width;
int h = rect.Height;
g.TranslateTransform(w/2, -h/2);
//在全局坐标下绘制椭圆
g.DrawEllipse(Pens.Red, -100, -100, 200, 200);
g.FillRectangle(Brushes.Black, -108, 0, 8, 8);
g.FillRectangle(Brushes.Black, 100, 0, 8, 8);
g.FillRectangle(Brushes.Black, 0, 100, 8, 8);
g.FillRectangle(Brushes.Black, 0, -108, 8, 8);
//创建一个椭圆然后在局部坐标系中进行变换
GraphicsPath gp = new GraphicsPath();
gp.AddEllipse(-100, -100, 200, 200);
Matrix mat2 = new Matrix();
//平移
mat2.Translate(150, 150);
//旋转
mat2.Rotate(30);
gp.Transform(mat2);
g.DrawPath(Pens.Blue, gp);
PointF[] p = gp.PathPoints;
g.FillRectangle(Brushes.Black, p[0].X-2, p[0].Y+2, 4, 4);
g.FillRectangle(Brushes.Black, p[3].X-2, p[3].Y+2, 4, 4);
g.FillRectangle(Brushes.Black, p[6].X-4, p[6].Y-4, 4, 4);
g.FillRectangle(Brushes.Black, p[9].X-4, p[9].Y-4, 4, 4);
gp.Dispose();
//base.OnPaint (e);
}
9、Alpha混合
Color.FromArgb()的A就是Alpha。Alpha的取值范围从0到255。0表示完全透明,255完全不透明。
当前色=前景色×alpha/255+背景色×(255-alpha)/255
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
//创建一个填充矩形
SolidBrush brush = new SolidBrush(Color.BlueViolet);
g.FillRectangle(brush, 180, 70, 200, 150);
//创建一个位图,其中两个位图之间有透明效果
Bitmap bm1 = new Bitmap(200, 100);
Graphics bg1 = Graphics.FromImage(bm1);
SolidBrush redBrush =
new SolidBrush(Color.FromArgb(210, 255, 0, 0));
SolidBrush greenBrush =
new SolidBrush(Color.FromArgb(210, 0, 255, 0));
bg1.FillRectangle(redBrush, 0, 0, 150, 70);
bg1.FillRectangle(greenBrush, 30, 30, 150, 70);
g.DrawImage(bm1, 100, 100);
//创建一个位图,其中两个位图之间没有透明效果
Bitmap bm2 = new Bitmap(200, 100);
Graphics bg2 = Graphics.FromImage(bm2);
bg2.CompositingMode = CompositingMode.SourceCopy;
bg2.FillRectangle(redBrush, 0, 0, 150, 170);
bg2.FillRectangle(greenBrush, 30, 30, 150, 70);
g.CompositingQuality = CompositingQuality.GammaCorrected;
g.DrawImage(bm2, 300, 200);
//base.OnPaint (e);
}
10、反走样
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
//放大8倍
g.ScaleTransform(8, 8);
//没有反走样的图形和文字
Draw(g);
//设置反走样
g.SmoothingMode = SmoothingMode.AntiAlias;
//右移40
g.TranslateTransform(40, 0);
//再绘制就是反走样之后的了
Draw(g);
//base.OnPaint (e);
}
private void Draw(Graphics g)
{
//绘制图形和文字
g.DrawLine(Pens.Gray, 10, 10, 40, 20);
g.DrawEllipse(Pens.Gray, 20, 20, 30, 10);
string s = "反走样测试";
Font font = new Font("宋体", 5);
SolidBrush brush = new SolidBrush(Color.Gray);
g.DrawString(s, font, brush, 10, 40);
}
更多 C#中GDI+编程10个基本技巧二相关文章请关注PHP中文网!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Arus char menyimpan urutan watak dalam bahasa C dan diisytiharkan sebagai array_name char [saiz]. Unsur akses diluluskan melalui pengendali subskrip, dan elemen berakhir dengan terminator null '\ 0', yang mewakili titik akhir rentetan. Bahasa C menyediakan pelbagai fungsi manipulasi rentetan, seperti strlen (), strcpy (), strcat () dan strcmp ().

Dalam C, jenis char digunakan dalam rentetan: 1. Simpan satu watak; 2. Gunakan array untuk mewakili rentetan dan berakhir dengan terminator null; 3. Beroperasi melalui fungsi operasi rentetan; 4. Baca atau output rentetan dari papan kekunci.

Dalam bahasa C, watak -watak khas diproses melalui urutan melarikan diri, seperti: \ n mewakili rehat garis. \ t bermaksud watak tab. Gunakan urutan melarikan diri atau pemalar watak untuk mewakili watak khas, seperti char c = '\ n'. Perhatikan bahawa backslash perlu melarikan diri dua kali. Platform dan penyusun yang berbeza mungkin mempunyai urutan melarikan diri yang berbeza, sila rujuk dokumentasi.

Kaedah penggunaan simbol dalam bahasa C meliputi aritmetik, tugasan, syarat, logik, pengendali bit, dan lain-lain. Operator aritmetik digunakan untuk operasi matematik asas, pengendali tugasan digunakan untuk penugasan dan penambahan, penolakan, pendaraban dan tugasan pembahagian, pengendali keadaan digunakan untuk operasi yang digunakan untuk operasi yang digunakan untuk Operasi Bit untuk Penunjuk null, penanda akhir fail, dan nilai bukan angka.

Perbezaan antara multithreading dan asynchronous adalah bahawa multithreading melaksanakan pelbagai benang pada masa yang sama, sementara secara tidak sengaja melakukan operasi tanpa menyekat benang semasa. Multithreading digunakan untuk tugas-tugas yang berintensifkan, sementara asynchronously digunakan untuk interaksi pengguna. Kelebihan multi-threading adalah untuk meningkatkan prestasi pengkomputeran, sementara kelebihan asynchronous adalah untuk tidak menghalang benang UI. Memilih multithreading atau asynchronous bergantung kepada sifat tugas: tugas-tugas intensif pengiraan menggunakan multithreading, tugas yang berinteraksi dengan sumber luaran dan perlu menyimpan respons UI menggunakan asynchronous.

Dalam bahasa C, penukaran jenis char boleh ditukar secara langsung kepada jenis lain dengan: Casting: Menggunakan aksara pemutus. Penukaran Jenis Automatik: Apabila satu jenis data dapat menampung jenis nilai lain, pengkompil secara automatik menukarkannya.

Tiada fungsi jumlah terbina dalam dalam bahasa C, jadi ia perlu ditulis sendiri. Jumlah boleh dicapai dengan melintasi unsur -unsur array dan terkumpul: Versi gelung: SUM dikira menggunakan panjang gelung dan panjang. Versi Pointer: Gunakan petunjuk untuk menunjuk kepada unsur-unsur array, dan penjumlahan yang cekap dicapai melalui penunjuk diri sendiri. Secara dinamik memperuntukkan versi Array: Perlawanan secara dinamik dan uruskan memori sendiri, memastikan memori yang diperuntukkan dibebaskan untuk mengelakkan kebocoran ingatan.

Strategi untuk mengelakkan kesilapan yang disebabkan oleh lalai dalam pernyataan suis C: Gunakan enums dan bukannya pemalar, mengehadkan nilai pernyataan kes kepada ahli yang sah dari enum. Gunakan kejatuhan dalam pernyataan kes terakhir untuk membiarkan program terus melaksanakan kod berikut. Untuk pernyataan suis tanpa kejatuhan, selalu tambahkan pernyataan lalai untuk pengendalian ralat atau memberikan tingkah laku lalai.
