【转】C++/GDI+ 学习笔记(四)——实用技巧——颜色矩阵(ColorMatrix)

来源:互联网 发布:mac系统word文件消失 编辑:程序博客网 时间:2024/05/21 18:47

颜色矩阵在GDI+中是十分有用的。

一位颜色信息,由ARGB四部分组成,分别是透明度和三个颜色分量。一个4×4的矩阵即可完整的表示出一个颜色的矩阵,但4*4矩阵无法完成一些变换(例如平移),所以补成了一个5×5的矩阵。最后的一位一直是1。

ColorMatrix colorMatrix = {

           0.3f,     0.3f,     0.3f,     0.0f,     0.0f,

           0.59f,   0.59f,   0.59f,   0.0f,     0.0f,

           0.11f,   0.11f,   0.11f,   0.0f,     0.0f,

           0.0f,     0.0f,     0.0f,     0.3f,     0.0f,

           0.0f,     0.0f,     0.0f,     0.0f,     1.0f };

上面的这个矩阵,是将图片转换成灰阶形式,即去色。[4][4]的位置即是永远为1。[3][3]处,是透明度,这里设置的是30%,所有的数字都是最大为1,即100%。

0.3×Red + 0.59×Green + 0.11×Blue 即是某点颜色的灰阶值。

ColorMatrix colorMatrix = {

           0.3f,     0.3f,     0.3f,     0.0f,     0.0f,

           0.59f,   0.59f,   0.59f,   0.0f,     0.0f,

           0.11f,   0.11f,   0.11f,   0.0f,     0.0f,

           0.0f,     0.0f,     0.0f,     0.3f,     0.0f,

           0.0f,     0.0f,     0.0f,     0.0f,     1.0f };

ImageAttributes imageAtt;

      imageAtt.SetColorMatrix( &colorMatrix );

Bitmap Bmp( “a.bmp” );

INT iWidth = Bmp.GetWidth();

INT iHeight = Bmp.GetHeight();

      Graphic.DrawImage(  // Graphic是事先初始化好的Graphics

           &Bmp,

Rect(0, 0, iWidth, iHeight),

           0,                                                               

           0,                                                               

           iWidth,                                             

           iHeight,                                            

           UnitPixel,

           &imageAtt);

双缓冲在GDI+里可以有效的提高描画效率。改善显示的质量。

  下面的代码是一个最简单的双缓冲的模板。可以根据需要,做简单的修改即可。

Bitmap CacheImage( [Width], [Height] );

Graphics CacheGraphics( &CacheImage );

// 对CacheImage进行描画

      // ......

// 获得窗口的Graphics对象

Graphics Graphic( [ Window’s HDC ] );

// 将描画好的CacheImage画到窗口上

      Graphic.DrawImage( &CacheImage, [Left], [Top] );

根据一些简单的测试,双缓冲可以有效的改善图像的处理速度。不过最明显的效果还是降低画面的闪烁程度。

另外还可以使用CachedBitmap类来做双缓冲。Graphic也有专门的DrawCachedBitmap方法来描画CachedBitmap。但没有上述的方法灵活。

原创粉丝点击