GDI+中常见的几个问题(10)

10. Graphics的几个属性。

今天我来讲讲Graphics在DrawImage里的几个的属性。

Graphics是GDI+里面的大拿,可以用来画线,画矩形,甚至可以用来画各种各样的材质。 通过不同的Pen,Brush来实现。具体的使用方法是所有想用GDI+的同学的基础,我就不详细讲 了,具体可以参考MSDN:http://msdn.microsoft.com/en-us/library/haxsc50a(VS.80).aspx 。我主要来讲2个大家不太注意的属性。

a.Graphics.CompositingMode

这是一个枚举属性,可以取的值有2种,一种是SourceOver, 另外一种是SourceCopy。这 定义了Graphics如何将当前颜色和背景合成。如果是SourceCopy,那么颜色不和当前背景合 成。如果是SourceOver,那么背景颜色会和当前的颜色混合,算法如下:

显示颜色 = 源颜色 × alpha / 255 + 背景颜色 × (255 - alpha) / 255

新颜色的透明分量是255,也就是不透明。我们来看看下面的代码:

private int CompositeColor(int color, int alpha, int  backgroudColor)
        {
            //显示颜色 = 源颜色 × alpha / 255 + 背景颜 色 × (255 - alpha) / 255
            return color * alpha / 255 + backgroudColor *  (255 - alpha) / 255;
        }
        private void Draw(object sender, EventArgs e)
        {
            this.BackColor = Color.FromArgb(255, 255, 255);
            Graphics g = this.CreateGraphics();
            g.CompositingMode =  System.Drawing.Drawing2D.CompositingMode.SourceOver;
            g.FillRectangle(new SolidBrush(Color.FromArgb(127, 255,  0, 0)), new Rectangle(0, 0, 200, 200));

            g.CompositingMode =  System.Drawing.Drawing2D.CompositingMode.SourceCopy;
            g.FillRectangle(new SolidBrush(Color.FromArgb(127, 255,  0, 0)), new Rectangle(200, 0, 200, 200));

            
            g.CompositingMode =  System.Drawing.Drawing2D.CompositingMode.SourceCopy;
            g.FillRectangle(new SolidBrush(Color.FromArgb(
                255,
                CompositeColor(255, 127, 255),
                CompositeColor(0, 127, 255),
                CompositeColor(0, 127, 255))
                ), new Rectangle(0, 200, 200, 200));

            g.Dispose();
        }

第1个色块和第2个色块分别是混合和不混合的,如果我们用不混合的方式希望得到混合的 效果,那么应该用第三个色块的写法。从下面的图像中我们可以很清楚地看到结果。

时间: 2025-01-23 11:08:43

GDI+中常见的几个问题(10)的相关文章

GDI+中常见的几个问题(8)

哈哈,这个星期Heroes第八集终于出来了,我继续顺着上一节外传讲下去,修改颜色怎么 做. 8.1 使用原始的方法修改图像的RGB以及色调,饱和度和亮度 最简单的办法,很容易,就是用之前的LockBits,然后直接修改R,G,B的数值,具体的就 不多说了.在GDI+里面,Color有3个方法,分别是GetHue(), GetSaturation(), GetBrightness().它是图像的色调,饱和度和亮度.其中Hue取值为[0,360),表示当前颜色 在哪一个角度,Saturation和B

GDI+中常见的几个问题(7)

7. 多帧图像 为了赶上英雄第三季的播放日程,我决定一个星期出一集. 在第七集Heroes里面,Peter 的功能都被他老爸吸收掉了.所以我的这个系列的第七集来讲讲GDI+没完全实现的一部分功 能. 多帧图像是指在一幅图像中有多个帧,支持多帧图像的格式不多,只有TIFF和GIF.其他 格式都不能作为多帧图像存储.其中TIFF可以支持很多页,GIF动画也支持多帧.使用GDI+可 以生成多帧TIFF,却没办法实现GIF动画的生成,有可能是因为专利的缘故.首先让我们来看 看怎么样在生成多帧的TIFF图

GDI+中常见的几个问题(5)

6.透明,半透明和不透明 这是个大题目.在WinForm/WPF里面我们经常会看到一些关于透明的属性,比如Backcolor 里面可以选择Transparant, Form里面有一个叫Opacity的属性.都是和透明以及透明度相关 的.在其实是在GDI+应用层上的一些东西,在这里我就不讲了.主要从更基本的地方讲起, 其中还包括两块完全不同的内容. 6.1 Alpha 我们在上一讲中提到了PixelFormat,当时我们在LockBits的时候把PixelFormat设定成为 Format24bp

GDI+中常见的几个问题(3)

4. 为啥读个图那么慢? 一般来说,读图可以用以下几种方法: 1 public static Image FromFile(string filename); 2 public static Image FromFile(string filename, bool useEmbeddedColorManagement); 3 public static Bitmap FromHbitmap(IntPtr hbitmap); 4 public static Bitmap FromHbitmap (

GDI+中常见的几个问题(11)

我在前面几章里面提到过ColorMatrix,可以将图像的色彩进行仿射变换.但是如果要对图 像的色彩进行非线性变换的话,那就必须用到更强悍的API了.在Windows早期,有一套标准 的色彩管理的API,叫做ICM 2.0 (Image Color Management 2.0).在Windows Vista 以后, 这套API升级成了WCS 1.0 (Windows Color System 1.0). 这套API实现了www.color.org 上说的色彩管理的算法,具体的内容在http:/

GDI+中常见的几个问题(9)

今天来讲讲上个星期遗留下来的东西:ColorMatrix. 9. Color Matrix 图像的本质是什么?对不同的人来说这是不同的东西.在计算机的世界中,啥东西都是数 据,图像也是一种数据.从自然界的光变成计算机的数据,需要通过采样和量化的处理.图 像在计算机中,其实是一个二维数组,从数学上来说,这其实是一个矩阵.图像中的每一个 点都是个四维向量,也就是(R,G,B,A), 在RGBA色彩空间中,我们可以使用一个矩阵对每一 个点(R,G,B,A)作矩阵乘法运算,这样就可以对图像色彩进行变换.

GDI+中常见的几个问题(6)

6.2 GIF GIF的全称是图像交换格式Graphics Interchange Format,是CompuServe公司在1987年创 建并使用的.这种格式使用8位索引值来表达一个像素,也就是说1个像素1个byte,最多可以 表示256种颜色.它使用LZW无损压缩算法来对图像进行压缩,之后这家公司又和几家其他的 公司发明了PNG文件格式,并被更广泛地应用在Web以及其他领域.GIF支持动画,可以保存数 个帧并不断地播放.关于动画的部分我们将会放到非常后面来讲,现在只谈谈GIF的透明. 在GI

GDI+中常见的几个问题(4)

5.读图是快了,处理怎么还是慢? GDI+的Bitmap类提供了两个罪恶的函数GetPixel, SetPixel,用来获取某个像素点的颜色 值.这个2个函数如果只调用一次两次也就罢了,万一我想把整张图片加红一点,用下面的代 码,我估计你等到黄花菜都凉了,还没有算完呢. 看看下面的代码是怎么写的. 1 FileStream fs = new FileStream(image, FileMode.Open, FileAccess.Read); 2 Image img = Image.FromStr

GDI+中常见的几个问题(1)

1.GDI+的前世今生 GDI+全称图形设备接口,Graphics Device Interface (GDI) ,他的爸爸叫做GDI, 用C写 的.Windows XP出来以后用C++重新写了一下,变成了GDI+.从.NET Framework 1.0开始, GDI+就被正式封装在了.NET Framework里面,并被广泛地应用到了所有和图形图像相关的程 序中.不幸的是,这个GDI+引入了微软有史以来最大的2个patch,造成了Microsoft IT, Support, Developer