图像 1

来源:互联网 发布:网络潮语2017 编辑:程序博客网 时间:2024/05/05 19:10

图像应用的方面太多了,看看GDI+中如何使用图像。

GDI+中两个能处理图像的类:Image类和Bitmap类。GDI+中有两个类是表示图像的:Bitmap类和Metafile类,都继承自Image类。Bitmap类提供了处理位图的功能,而Metafile类提供的是处理矢量图像的功能,所以这里只有讨论Bitmap和Image类的功能。

Image类是一个抽象类,不能直接创建Image对象,只能创建继承于它的Bitmap类的实例。Image对象用于两个目的:在绘图表面上绘制图像,把图像用作绘图表面。

Bitmap类继承于Image,Bitmap对象是光栅图像的一种表达方式,即像素的矩形网格。Bitmap对象在运行期间保存到内存中的位图图像的方式,可以使用Bitmap对象的功能从磁盘上加载或创建一个全新的图像,之后就可以对内存中的图像执行其他处理。

功能:

加载图像:从文件或其他源中加载图像。

显示图像:控制图像的大小、比例、分辨率和质量等。

处理图像:修剪、变形、旋转、拷贝图像等。

保存图像:将绘图工作保存到某文件或其他永久存储器上。

1.加载图像

GDI+支持的位图文件格式。Bmp(Windows使用的标准格式,无压缩),Exif(许多数字相机使用的一种格式,包含图像的额外信息),Gif(网页的常见格式,可包含多个用于动画的图像,无损失),JPEG(网页的另一种常见格式,最适用于图片),PNG(支持更大的颜色深度,能逐步显示,无损失),TIFF(比较旧的格式,用于桌面发布、传真等)。

在保存和加载图像时需要考虑图像的文件格式,.NET Framework为不同的图片格式提供了一组编码和解码器,以适应上述多种格式。有必要自己可以编写自己的编码器。可以查看ImageCodeInfo类查看系统支持的解码编码器。

Bitmap bmp = new Bitmap("C:\\Users\\ZQNB\\Desktop\\dog.png");

2.显示图像

Graphics g = e.Graphics;
            Bitmap bmp = new Bitmap("C:\\Users\\ZQNB\\Desktop\\dog.png");
            g.DrawImage(bmp, 0, 0);

如图:,这里跟简单,加载和显示了一张图片,图片的大小、分辨率显示都是在后台完成的。

查看大小和分辨率:

这里主要讨论对图像显示的控制,修改图片的大小、比例、分辨率和插补等。

位图图像的大小可以通过Bitmap对象的Width和Height属性来访问,因为图像时基于光栅的,它们的值用像素为单位。

位图图像的分辨率,即图像的点/英寸的值(DPI),通过绘图表面的分辨率,图片本身的大小,来计算显示的图像的大小。

公式如下:       显示图片的大小 / 事迹图片的大小 = 显示的分辨率 / 图片的分辨率

图片的像素和分辨率的关系:     分为垂直和水平,水平像素 = 水平分辨率 * 图片水平长度

添加如下代码:

Console.WriteLine("Screen resolution:" + g.DpiX + "DPI");
            Console.WriteLine("Image resolution:" + bmp.HorizontalResolution +"DPI");
            Console.WriteLine("Image Width:" + bmp.Width);
            Console.WriteLine("Image Height:" + bmp.Height);

            SizeF s = new SizeF(bmp.Width * (g.DpiX / bmp.HorizontalResolution), bmp.Height * (g.DpiY / bmp.VerticalResolution));
            Console.WriteLine("Display size of image:" + s);

输出如图:

可以看到我的机器分辨率是96DPI,图片也是96DPI。这个图片是216*173像素。

控制位图的比例:

一种方式是在不缩放原图的条件下,提前在内存或磁盘上创建位图的重置大小的拷贝。利用DrawImage的重载,将图像绘制在一个矩形绘图表面上,利用矩形大小控制图片的缩放。

g.DrawImage(bmp, this.ClientRectangle);  //使图片充满用户区域。

如图:

改变位图的分辨率:

可以调用Bitmap对象的SetResolution方法,改变位图的分辨率。改变分辨率会改变图片大小。

示例:

 Graphics g = e.Graphics;
            Bitmap bmp = new Bitmap("C:\\Users\\ZQNB\\Desktop\\dog.png");
            bmp.SetResolution(100f, 100f);
            g.DrawImage(bmp, 0, 0);
            bmp.SetResolution(200f, 200f);
            g.DrawImage(bmp, 250, 0);

如图:

左边图分辨率为100DPI,右边为200DPI。原图为96DPI。

图片的质量:

在对图片大小进行缩放时,特别是放大时,GDI+需要会使用一个图像放大算法来确定新像素的颜色。这个过程叫做插补,使用插补模式来控制图像质量。

GDI+允许通过赋予Graphics.InterpolationMode属性的值,编程控制图像重置大小的质量。这个属性的值取自InterpolationMode枚举,这个枚举含有5个值,分别为:

NearestNeighbor , Bilinear(默认), HighQualityBilinear, Bicubic, HighQualityBicubic.另外还有三个值可以用:Default    High   Low.    

来看看效果:

int width = bmp.Width;
            int height = bmp.Height;
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
            g.DrawImage(bmp, new Rectangle(10, 10, 150, 150), new Rectangle(0, 0, width, height), GraphicsUnit.Pixel);
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.DrawImage(bmp, new Rectangle(160, 10, 150, 150), new Rectangle(0, 0, width, height), GraphicsUnit.Pixel);

如图:

虽然不是很明显,但是可以看出右边的图像有较高的质量。


0 0