GDI+中的矩阵变换

DOTNET开发 专栏收录该内容
29 篇文章 0 订阅

一、颜色变换ColorMatrix

ColorMatrix位于System.Drawing.Imaging命名空间。
它的构造函数有两个,
public ColorMatrix();
public ColorMatrix(Single[][]);
如果使用参数为空的构造函数,可以在程序指定颜色矩阵的各值,也可以直接在构造函数中传递矩阵各值,这样采用第二个构造函数。
虽然在SDK文档中解释ARGB 矢量表示为 Alpha、Red(红色)、Green(绿色)、Blue(蓝色)和 W,其实排列顺序应该是RGBAW,Alpha是第四个向量,如[R G B A W]。
在颜色矩阵中,第5行5列的值必须是1,,在5列的各值必须是0(除第5行5列),这样保证最后得到的颜色矢量的w向量的值仍然为1.微软为什么要加以个w向量呢,下面慢慢解释

   

颜色变换公式:
  [r g b a w]=[r0 g0 b0 a0 w0]M

可以得到
r=A00r0 + A10g0+ A20b0 + A30a0 + A40w0
g=A01r0 + A11g0+ A21b0 + A31a0 + A41w0
b=A02r0 + A12g0+ A22b0 + A32a0 + A42w0
a=A03r0 + A13g0+ A23b0 + A33a0 + A43w0
w=A04r0 + A14g0+ A24b0 + A34a0 + A44w0
因为w0=1,A04=A14=A24=A34=0,A44=1
所以w总为1
大家可以看到新的r,g,b,a向量除了和原来颜色的值r,g,b,a相关外,还可以增加一
与原来颜色无关的值,分别为A40w0、A41w0、A42w0、A43w0,这就是为什么加了一向量w。
构造不同的矩阵,注意A40、A41、A42、A43的值一般取值在[-1,1],否则一旦超出值,很容易达到颜色的最大值。

 

显示出来是全白色
你可以察看我构造的几个颜色矩阵进行的图像处理的效果

Red通道

 

Green通道

Blue通道

Alpha通道

灰度

主要代码:


   
   Bitmap bitmap = new Bitmap("smallnest.bmp");

   // Initialize the color matrix.
   float[][] matrixItems ={
            new float[] {0.4f, 0.2f, 0.4f, 0, 0},
            new float[] {0.4f, 0.2f, 0.4f, 0, 0},
            new float[] {0.4f, 0.2f, 0.4f, 0, 0},
            new float[] {0, 0, 0, 1, 0},
            new float[] {0, 0, 0, 0, 1}};
   ColorMatrix colorMatrix = new ColorMatrix(matrixItems);

   // Create an ImageAttributes object and set its color matrix.
   ImageAttributes imageAtt = new ImageAttributes();
   imageAtt.SetColorMatrix(
    colorMatrix,
    ColorMatrixFlag.Default,
    ColorAdjustType.Bitmap);

   
   // Now draw the semitransparent bitmap image.
   int iWidth = bitmap.Width;
   int iHeight = bitmap.Height;
   this.Width=iWidth;
   this.Height=iHeight;
   e.Graphics.DrawImage(
    bitmap,
    new Rectangle(0, 0, iWidth, iHeight),  // destination rectangle
    0.0f,                          // source rectangle x
    0.0f,                          // source rectangle y
    iWidth,                        // source rectangle width
    iHeight,                       // source rectangle height
    GraphicsUnit.Pixel,
    imageAtt);

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
序言 4 目标 4 适用范围 4 适用读者 4 运行环境 4 文档组织 4 相关主题 4 GDI+安全考虑 6 检验构造函数调用成功与否 6 分配缓冲区 6 错误校验 8 线程同步 9 相关主题 10 关于GDI+ 11 GDI+ 介绍 11 GDI+ 概览 11 GDI+ 三个组成部分 11 基于类接口架构 12 GDI+提供了哪些新东西? 12 新特征 12 编程模式改变 15 线条、曲线和图形 19 矢量图概览 19 钢笔、线条和矩形 20 椭圆和弧 22 多边形 22 基数样条 23 贝塞尔样条 24 路径 25 画刷和填充图形 27 开放与闭合曲线 29 区域 30 裁剪 31 路径平直化 32 线条和曲线抗锯齿功能 32 图象、位图和图元文件 33 位图类型 34 图元文件 37 绘制、定位和复制图片 39 裁剪和缩放图象 40 坐标系统和转换 42 坐标系统类型 42 以矩阵来表示转换 44 全局和局部转换 48 图形容器 51 使用GDI+ 56 使用入门 56 绘制线条 56 绘制字符串 58 使用钢笔绘制线条和形状 59 使用钢笔绘制线条和矩形 59 设置钢笔宽度和对齐方式 60 绘制具有线帽线条 61 联接线条 62 绘制自定义虚线 62 绘制用纹理填充线条 63 使用画笔填充形状 63 用纯色填充形状 64 用阴影图案填充形状 64 用图像纹理填充形状 64 在形状平铺图像 65 用渐变色填充形状 68 使用图像、位图和图元文件 68 加载和显示位图 68 加载和显示图元文件 69 记录图元文件 69 剪裁和缩放图像 71 旋转、反射和扭曲图像 72 缩放时使用插值模式控制图像质量 73 创建缩略图像 75 采用高速缓存位图来提高性能 76 通过避免自动缩放改善性能 76 读取图像元数据 77 使用图像编码器和解码器 83 列出已安装编码器 83 列出已安装解码器 84 获取解码器类标识符 86 获取编码器参数列表 88 将BMP图像转换为PNG图像 100 设定JPEG压缩等级 101 对JPEG图像进行无损变换 102 创建和保存多帧图像 105 从多帧图像复制单帧 107 Alpha 混合线条和填充 109 绘制不透明和半透明线条 109 用不透明和半透明画笔绘制 110 使用复合模式控制 Alpha 混合 111 使用颜色矩阵设置图像 Alpha 值 112 设置单个象素alpha值 114 使用字体和文本 115 构造字体系列和字体 115 绘制文本 116 格式化文本 117 枚举已安装字体 120 创建专用字体集合 122 获取字体规格 126 对文本使用消除锯齿效果 130 构造并绘制曲线 131 绘制基数样条曲线 131 绘制贝塞尔样条 133 用渐变画刷填充形状 134 创建线性渐变 134 创建路径渐变 137 将 Gamma 校正应用于渐变 144 构造并绘制路径 145 使用线条、曲线和形状创建图形 145 填充开放式图形 147 使用图形容器 147 管理 Graphics 对象状态 148 使用嵌套 Graphics 容器 151 变换 154 使用世界变换 154 为什么变换顺序非常重要 155 使用区域 156 对区域使用点击检测 156 对区域使用剪辑 157 对图像重新着色 158 使用颜色矩阵对单色进行变换 158 转换图像颜色 160 缩放颜色 161 旋转颜色 164 剪取颜色 166 使用颜色重映射表 168 打印 169 将GDI+输出至打印机 169 显示一个打印对话框 172 通过提供打印机句柄优化打印 173 附录:GDI+ 参考 176
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值