C# GDI+ 各种操作

时间:2023-02-09 23:46:36

本教程由鄙人mywatermelon原创,麻烦各位做老翻或者转载的时候注明下鄙人名字。内容有任何纰漏欢迎提出……


本节介绍基本的贴图技巧,同样地,在进行绘图之前在窗体上放置两个PICTUREBOX控件,并输入以下声明:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Graphics a;
        private void Form1_Load(object sender, EventArgs e)
        {
              a=pictureBox1.CreateGraphics();
        }

 

1、绘制图片(也叫贴图)

如下图所示,我们先在PICTUREBOX2中加载一张图片,而我们的目的是要使用GDI+的方法将PICTUREBOX2的图片贴到PICTUREBOX1里面去。可能你会问,为什么不直接使用picturebox1.image=picturebox2.image这条指令来实现又或者多个picturebox控件叠加起来直接了当,但是picturebox1自身的局限性没办法让你将多张图片同时动态地贴到一个图片控件里面。举个例子,你要做一个时钟,有4张贴图你得处理:钟盘、时针、分针、秒针。钟盘可以直接了当地贴上去,但是时针、分针、秒针就得根据不同时间按照不同角度地贴在图片当中,这就是一般picturebox所不能做到而需要GDI+的帮助的。

C# GDI+ 各种操作

 

首先得了解实现GDI基本贴图的指令:

a.DrawImage(Image image,Point point);

image:设置要贴上去的图片,可以直接使用picturebox的image属性(即picturebox1.image)

point:设置你打算将图片贴到那个点的位置

 

以下是实例,假若想将上图的钟盘贴到picturebox1里面的(10,20)位置,指令如下:

       private void Form1_Click(object sender, EventArgs e)
        {
            a.DrawImage(pictureBox2.Image, new Point(10, 20));
        }

C# GDI+ 各种操作


2、图片缩放

当某些时候我们需要对图片进行缩放时候,可以使用以下方法来实现:

 a.DrawImage(Image image,Rectangle rectangle);

 

image:设置要贴上去的图片,可以直接使用picturebox的image属性(即picturebox1.image)

rectangle:rectangle里面由4个属性组成,分别是(x,y,width,height),x设置你打算粘贴到的那个点的x坐标,y设置你打算粘贴到的那个点的y坐标,width设置图片缩放后的长度,height设置图片缩放后的高度。

 

以下是实例,假若我们将之前的钟盘缩放至宽50高50的尺寸,然后贴到点(10,20)处,以下就是代码:

 a.DrawImage(pictureBox2.Image,new Rectangle(10,20,50,50));

C# GDI+ 各种操作


3、部分截取贴图

以下是一张背景透明的图片,里面有不少数字,如果我们想单独抠出某个数字来贴图,这样又该怎么做了?说步骤之前也许你会问,用得着这样麻烦吗?一个数字一张图片这样贴图不好吗?采用这样的贴图方式其实有很多的原因,主要是为了减少文件数量,但减少文件数量并不只是为了美观而已。众所周知,动画是由一张张图片组成,一个游戏进行的是动态的动画贴图。如果采用常规的方法贴图的话,是按照以下步骤:读取图片A----贴图----读取图片B----贴图...,但是这其中存在一个很大的问题就是,读取图片需要一定时间,或许这是一个很小的时间,但是这样的时间在动画里面图片的数量(专业的名称叫帧数)太多的时候,很小的时间就会累积起来变成很长的时间,大大增加了处理的效率。于是就出现了现在的这种动画贴图的方法,把所有图片合并成一张大的图片,一次性读取,使用的时候按需再采用相应的计算机函数截取大图片中的一些部分来贴图,这样的速度就快捷很多。

 

C# GDI+ 各种操作

 

实现部分截取贴图的函数如下:

a.DrawImage(Image image,Rectangle desRectangle,Rectangle souRectangle, GraphicsUnit gra);

Image:设置要贴上去的图片,可以直接使用picturebox的image属性(即picturebox1.image)

desRectangle:desrectangle里面由4个属性组成,分别是(x,y,width,height),x设置你打算粘贴到的那个点的x坐标,y设置你打算粘贴到的那个点的y坐标,width设置图片缩放后的长度,height设置图片缩放后的高度。

souRectangle:sourectangle里面由4个属性组成,分别是(x,y,width,height),4个参数组成一个矩形,矩形范围所包括的图像将会进行贴图,x设置矩形框的x坐标,y设置矩形框的y坐标,width设置矩形框的长度,height设置矩形框的高度。

gra:设置使用什么单位来贴图,默认是使用GraphicsUnit.pixel,也就是使用像素作为单位。

 

下面是实例,我们要截取图片上的0字进行贴图,由于上面源图片的大小是480*48,每个字都是平均排列(也就是说每个字的大小是48*48),因为不难推算出0字的范围是(0,0,48,48),即souRectangle要设置成new rectangle(0,0,48,48)。假若我们要贴到(10,20)这个位置的话,以下是详细实例:

        private void Form1_Click(object sender, EventArgs e)
        {
         
            a.DrawImage(pictureBox2.Image,new Rectangle(10,20,48,48), new Rectangle(0, 0, 48, 48), GraphicsUnit.Pixel);
        }

C# GDI+ 各种操作