代码如下:
//创建一个图片对象用来装载要被添加水印的图片 Image imgPhoto = Image.FromFile("H:\\SourceImage.png");
//获取源图片的宽和高 int SourceImageWidth = imgPhoto.Width; int SourceImageHeight = imgPhoto.Height; //建立一个Bitmap图片,大小和源图片保持一致 Bitmap bmPhoto = new Bitmap(SourceImageWidth, SourceImageHeight, PixelFormat.Format24bppRgb); //设置Bitmap的分辨率=源图片分辨率 bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
//封装一个GDI+ 绘图图面 Graphics grPhoto = Graphics.FromImage(bmPhoto);
问题:从上面的代码中创建的imgPhoto、bmPhoto和grPhoto 是什么关系,他们之间的内存是如何关联的?
imgPhoto用于连接外部的一张图片,也就是将硬盘中的图片读入内存中,grPhoto相当于一个画笔,bmPhoto相当于一块画板与原来连接的图片大小而像素格式一样,那么要画水印的时候就可以先用grPhoto将外部的图片画到bmPhoto中在用grPhoto在bmPhoto中你指定的位置画上水印,那么bmPhoto上面的图案就是你所要的最终图案,最后只要将bmPhoto中的图案保存到硬盘就可以了
//创建一个图片对象用来装载要被添加水印的图片 Image imgPhoto = Image.FromFile("H:\\SourceImage.png"); //获取源图片的宽和高 int SourceImageWidth = imgPhoto.Width; int SourceImageHeight = imgPhoto.Height; //建立一个Bitmap图片,大小和源图片保持一致 Bitmap bmPhoto = new Bitmap(SourceImageWidth, SourceImageHeight, PixelFormat.Format24bppRgb); //设置Bitmap的分辨率=源图片分辨率
bmPhoto.SetResolution(imgPhoto.HorizontalResolution, mgPhoto.VerticalResolution); //封装一个GDI+ 绘图图面 Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto 和 bmPhoto有关系,grPhoto在bmPhoto上面绘制
imgPhoto和其他的两个没什么关系,就是去了其大小,用了创建一个和他一样大小的bmPhoto
// 摘要:
// 封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成。System.Drawing.Bitmap 是用于处理由像素数据定义的图像的对象。
Bitmap : Image
// 摘要:
// 为源自 System.Drawing.Bitmap 和 System.Drawing.Imaging.Metafile 的类提供功能的抽象基类。
Image : MarshalByRefObject, ISerializable, ICloneable, IDisposable
// 摘要:
// 封装一个 GDI+ 绘图图面。无法继承此类。
Graphics : MarshalByRefObject, IDeviceContext, IDisposable
Graphics把图像展示到画布上,Image只是将图像读到内存中(不展示),Bitmap将读到的图像转化成位图内容(不展示)。Bitmap内部使用了GDI+对图片内容进行了转换。
再保存图片的时候,Bitmap(不是位图则要转换)和Image直接输出内寸。Graphics生成新的内存输出。
imgPhoto 是磁盘中的图片文件。
bmPhoto 是在内存中新建的一个图像对象,建的时候是按照 imgPhoto 的大小和分辨率。
grPhoto 是画图对象。也可以这么认为 grPhoto 的画图板的背景是 bmPhoto。
在内存中 imgPhoto 和 bmPhoto、grPhoto 没有关系,操作 grPhoto 直接受影响的是 bmPhoto。