ColorMatrix是个5 * 5浮点数矩阵

GDI+ 提供用于存储和操作图像的 Image 和 Bitmap 类。Image 和 Bitmap 对象将每个像素的颜色都存储为 32 位的数:红色、绿色、蓝色和 alpha 各占 8 位。这四个分量的值都是 0 到 255,其中 0 表示没有亮度,255 表示最大亮度。alpha 分量指定颜色的透明度:0 表示完全透明,255 表示完全不透明。
        颜色矢量采用 4 元组形式(红色、绿色、蓝色、alpha)。例如,颜色矢量 (0, 255, 0, 255) 表示一种没有红色和蓝色但绿色达到最大亮度的不透明颜色。
        表示颜色的另一种惯例是用数字 1 表示亮度达到最大。使用这种惯例,上一段中描述的颜色将用 (0, 1, 0, 1) 表示。GDI+ 在进行颜色变换时使用以 1 表示最大亮度的惯例。
        可通过用 4×4 矩阵乘以这些颜色矢量将线性变换(旋转和缩放等)应用到颜色矢量中。但是,您不能使用 4×4 矩阵进行平移(非线性)。如果在每个颜色矢量中再添加一个虚拟的第 5 坐标(例如,数字 1),则可使用 5×5 矩阵应用任何组合形式的线性变换和平移。由线性变换组成的后跟平移的变换称为仿射变换。

理解和掌握ColorMatrix变换,能使你的图像产生千变万化的效果。

黑白头像绘制:

Bitmap * pBkBmp = Gdiplus::Bitmap::FromFile(bk_image);
if(pBkBmp)
{
    ColorMatrix colorMatrix = {

         (0.299f,0.299f,0.299f,0.0f,0.0f),

         (0.587f,0.587f,0.587f,0.0f,0.0f),

         (0.114f,0.114f,0.114f,0.0f,0.0f),

         (0.0f,0.0f,0.0f,1.0f,0.0f),

         (0.0f,0.0f,0.0f,0.0f,1.0f )

    };
    ImageAttributes imageAttr;
    imageAttr.SetColorMatrix(&colorMatrix);
    Graphics g(hDC);
    g.DrawImage(pBkBmp, Gdiplus::RectF(m_rcItem.left, m_rcItem.top, GetWidth(), GetHeight()), 0, 0, pBkBmp->GetWidth(), pBkBmp->GetHeight(),     Gdiplus::UnitPixel, &imageAttr);
    g.ReleaseHDC(hDC);
    SafeDelete(pBkBmp);
}