GDI+

第一章

1.1概念

GDI+是图形设备接口的英文缩写(Graphics Device Interface),它是.NetFrameWork中的一部分,实现了对底层GDI功能的封装。GDI是系统提供的一组图形绘制接口。

DirectX是另一个与图形编程有关的微软技术。

1.2GDI+命名空间

1.3绘图表面

1.4绘图表面对应的类 

 

1.4Graphics功能

填充或画线重载方法请参考http://msdn.microsoft.com/library 网站。还包含的其它功能如下:

剪切:指绘图表面的某一区域,在设置了剪切区域后,执行的绘图操作就不会影响该剪切区域外部的任务像素。

转换:可以对绘图提供缩放、转换(在X或Y轴上移动)、旋转操作。

字体度量:测量字符串在绘图表面上的大小。

与GDI代码的互操作性:在C#中调用C++绘图代码,使用Graphics.GetHdc方法获取设备上下文,并将该设备上下文传给C++方法。使用Craphics.FromHDC方法从设备上下文中创建一个Craphics对象。

1.5坐标系

使用假想二维表格显示像素,绘制的起点为方框的中心。

例1:绘制一条直线(1,2,5,2)坐标表示如下图

注:实际绘制的长度为5。 因为在页面上绘制的元素的实际宽度要比每一边大半个像素。

例2:绘制一个矩形(1,0,5,4)坐标表示如下图

注:实际GDI+会把宽度和高度多绘制一个像素。是因为绘制的起点是从每个方框的中心点开始的,在页面上绘制的元素的实际宽度要比每一边大半个像素,所以最后的宽度是6个像素。 

例3:填充一个矩形(1,0,5,4)坐标表示如下图

注:填充时不需要考虚画笔问题,起点就是整体方框,所以矩形的宽度是5而不是6个像素。  

1.6锯齿与反锯齿

代码调置:e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

例1:填充一个矩形(1,0,5,4)的反锯齿效果如下图

1.7如何准确的对齐某些像素

(1)关闭反锯齿功能。

(2)使用浮点数做为坐标点,如填充一个矩形(1.5f,0.5f,4,3)。

 1.8常用类及方法

第二章

1.1Pen钢笔

(1)与笔刷一起使用

SolidBrush solidBrush = new SolidBrush(Color.Red);
Pen pen = new Pen(solidBrush);

 

(2)Pen的Alignment属性

(3)Pen的DashStyle属性

SolidBrush solidBrush = new SolidBrush(Color.Red);
Pen pen = new Pen(solidBrush);

//15像素长的短线,接着是5像素长的空隙,
//然后是10像素长的短线,接着是5像素长的空隙。
float[] f = { 15, 5, 10, 5 };
pen.DashStyle = DashStyle.Custom;
pen.DashPattern = f; 

注:如果钢笔的线宽大于1像素时,每条短线和空隙的实际长度就要用数组中指定的值乘以钢笔的线宽。便如将宽度设置为2时,数组值由{15,5,10,5}变为{30,10,20,10},效果如下图。

 (4)Pen的StartCap和EndCap属性

 

注:自定义线段端部使用CustomStartCap和CustomEndCap属性,可以使用GraphicsPath类创建端部。

(5)Pen的LineJoin属性

1.2文本绘制

(1)文字测量

GDI+会添加额外的1/6em长度。可以使用StringFormat.GenericTypography静态属性来去掉增加的长度。

Graphics.MeasureString(“文本内容”,this.Font,Int32.MaxValue,StringFormat.GenericTypography);

Graphics.DrawString("文本内容",this.Font,Brushes.Black,RectangleF(),StringFormat.GenericTypography);

(2)字体样式

 (3)字体换行

  • 默认在英文单词的空格处换行。

  • 显示换行

在字符串中加入\n。

  • 强制不换行

(4)文本的水平和垂直居中

(5)绘制竖向文本,可以让文本旋转90度或使用StringFormat对象。

StringFormat sf=new StringFormat(StringFomatFlags.DirectionVertical);

1.3制表位

(1)左对齐制表位

float[]ts={10.0f,70.0f,100.0f,90.0f};

//数组长度表示要设置制表位的个数,以及每个制表位的宽度。第一个制表位距离边框矩形的左边10个像素,第二个制表位则距离第一个制表位70个像素,第三个距离第二个100个像素,第四个距离第三个制表位90个像素。

new StringFormat().SetTabStops(0.0f,ts);

 

\t\n混合使用

 

(2)右对齐制表位 

1.4使用笔刷填充字体

HatchBrush hb=new HatchBrush(HatchStyle.Cross,Color.White,Color.Black);

1.5获取系统字体列表

方式一:new InstalledFontCollection().Families;

方式二:FontFamily.GetFamilies(e.Graphics);

1.6字体规格

1.7文本的质量

e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;

注:反锯齿功能适合于CRT显示器。

(1)使用ClearType字体特性

ClearType反锯齿技术是微软专有的,比标准反锯齿技术绘制的文本要清晰得多,它只能用于彩色LCD屏幕,且只能在XP下使用。

1.8统一文字和画布的单位

第二章

2.1Image

 (1)分辨率

Bitmap bmp=new Bitmap("xx.jpg");//原图分辨率为300X300

bmp.SetResolution(600f,600f);//修改为600X600

g.DrawImage(bmp,0,0);

bmp.SetResolution(1200f,1200f);//修改为1200X1200

g.DrawImage(bmp,180,0);

不同分辨率下的图片显示效果如下:

大小变化原因如下:

原图分辨率为300DPI,大小是1000X1100像素,在内存中的图像宽度是1000/300=3.333inches,高度是1100/300=3.667inches。

修改分辨率为600DPI,在内存中的图像宽度是1000/600=1.667inches,高度是1100/600=1.833inches。 

修改分辨率为1200DPI,在内存中的图像宽度是1000/1200=0.833inches,高度是1100/1200=0.916inches。 

(2)插补像素

在图像放大时,通过精确插补新像素值的算法来得到质量较高的图像。

使用g.InterpolationMode属性设置绘制的图片质量。

(3)截取图像

Rectangle sr=New Rectangle(80,60,400,400);//保留内容

Rectangle dr=New Rectangle(0,0,200,200);//在画布上绘制截取图片的位置

g.DrawImage(bmp,dr,sr,GraphicsUnit.Pixel);

(4)变形

Point[]dp={Point(0,0),Point(100,0),Point(50,100)};//左上角坐标、右上角坐标、左下角坐标

g.DrawImage(bmp,dp);

 

(5)翻转图像

Point[]dp={Point(0,100),Point(100,100),Point(0,0)};//左上角坐标、右上角坐标、左下角坐标

g.DrawImage(bmp,dp);//垂直翻转

Point[]dp={Point(100,0),Point(100,100),Point(0,0)};//左上角坐标、右上角坐标、左下角坐标

g.DrawImage(bmp,dp);//向右旋转90度。

注:效果类似于使用Bitmap.RotateFlip方法,区别在于画布上处理,还是对内存数据处理。

 (6)图像复制(可复制整体或部分图像)

Rectangle r=New Rectangle(120,120,400,400);

Bitmap bmp2=bmp.Clone(r,PixelFormat.DontCare);//复制矩形大小不能超出源图像范围,否则会报内存溢出异常。

(6)缩略图

可以文件中读取,如文件不包含缩略图数据,系统会将原图缩小并返回。

GetThumbnailImageAbort callback=new GetThumbnailImageAbort(委托方法);

Image im=bmp.GetThumbnailImage(40,40,callback,IntPtr.Zero);

g.DrawImage(im,0,0,im.Width,im.Height);

im.Dispose();

(7)创建新图像

Bitmap bmp=new Bitmap(100,100);

Graphics g=Graphics.FromImage(bmp);

注:一般为提升性能,会将多次绘制操作先绘制到图片上,最后将图片在显示器上绘制。

2.2双缓存

 (1)使用SetStyle方法

SetStyle(ControlStyles.DoubleBuffer,true);

SetStyle(ControlStyles.AllPaintingInWmPaint,true);

SetStyle(ControlStyles.UserPaint,true);

 

(2)图层与图层之间的颜色处理

设置Graphics.CompositingMode属性,效果如下图;

(3)获取图片像素和播放Gif图片

new Bitmap().GetPixel(x,y); 

注:ColorMatrix和ImageAttributes类使用。

(4)图片格式转换

ImageCodeInfo、EncoderParameters、

第三章

3.1GraphicsPath

gp.StartFigure():开启第二个图形绘制,如果第一个图形使用了CloseFigure()方法,默认自动开启第二个图形绘制。

gp.CloseFigure():结束路径绘制。或将第一个图形的开始和结束座标相同。

gp.CloseAllFigures():闭合路径上的所有图形。

gp.AddString();创建文字路径。

路径填充

其它属性

其它方法

3.2Region

(1)使用GraphicsPath、Rectangle初始化Region。

(2)在一个区域中创建另一个区域,Region r1=new Region(new Region().GetRegionData());

(3)两个区域的并集与交集

 

注:GraphicsPath和Region都可以是不连接或不连续的,Region还可以是无限大的。 

第四章

4.1变换方法

第五章

5.1自定义控件属性在VisualStudio.NET默认值

[DefaultValue("HellWord")]

public StringText

{

get{return text;}

 }

set{text=value;}

注:属性是对象时需要使用Reset<PropertyName>()和Should'Serialize<PropertyName>()方法。

5.2自定义控件属性在VisualStudio.NET分类

[Category("Appearance")]

5.3类型转换方法

TypeConverter转换类,主要包括CanConvertFrom()、CanConvertTo()、ConvertFrom()、ConvertTo()。

5.4Editor特性

使用对话框来编辑控件属性值,如设置字体和设置颜色。也可以实现下拉菜单式。

 

[Editor(typeof(NumberRangeEditor),typeof(UITypeEditor))]

public struct NumberRange

{

}

 

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值