当前位置: 首页 > 编程日记 > 正文

ColorMatrix 彩色矩阵

选择自 hbzxf 的 Blog

首先对装配脑袋给出上两片文章的友好回复,还有网友Fisherman一起探讨ColorMatrix话题表示感谢!

ColorMatrix (彩色矩阵) 类位于System.Drawing.Imaging命名空间 先看看下面的代码

ColorMatrix cm = new ColorMatrix(new float[][]{   new float[]{0.5f,0.5f,0.5f,0,0},
    
new float[]{0.5f,0.5f,0.5f,0,0},
    
new float[]{0.5f,0.5f,0.5f,0,0},
    
new float[]{0,0,0,1,0,0},
    
new float[]{0,0,0,0,1,0},
    
new float[]{0,0,0,0,0,1}}
);

矩阵系数组成一个 5x5 的线性转换,用于转换 ARGB 的单色值。例如,ARGB 向量表示为 Alpha、Red(红色)、Green(绿色)、Blue(蓝色)和 W,此处 W 始终为 1。

那么w是什么?为什么要定义为5x5的矩阵呢?

经过查找MSDN发现有这篇文章 《使用颜色矩阵对单色进行变换》里面这样讲到:

GDI+ 提供用于存储和操作图像的 ImageBitmap 类。ImageBitmap 对象将每个像素的颜色都存储为 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 矩阵应用任何组合形式的线性变换和平移。由线性变换组成的后跟平移的变换称为仿射变换。

我认为可以理解为虚拟向量


在Visual C#下实现图像的透明处理 这篇文章写得不错建议看看
 地址:
http://tech.ccidnet.com/pub/article/c294_a36258_p1.html

彩色矩阵应用到图像上可以使用ImageAttributes.SetColorMatrix 方法

[C#]

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace GrayShear
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
    public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
      //
// TODO: Add any constructor code after InitializeComponent call
//
}
    /// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null) 
{
components.Dispose();
}
}
base.Dispose( disposing );
}
    #region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
// 
// Form1
// 
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(296, 269);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
    }
#endregion
    /// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() 
{
Application.Run(new Form1());
}
    private void Form1_Load(object sender, System.EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter="Image files (*.BMP, *.JPG, *.GIF)|*.bmp;*.jpg;*.gif";
if(dlg.ShowDialog()==DialogResult.OK)
{
Image img = Image.FromFile(dlg.FileName);
Bitmap bm = new Bitmap(img.Width,img.Height);
Graphics g = Graphics.FromImage(bm);
 
        
ColorMatrix cm = new ColorMatrix(new float[][]{   new float[]{0.5f,0.5f,0.5f,0,0},
new float[]{0.5f,0.5f,0.5f,0,0},
new float[]{0.5f,0.5f,0.5f,0,0},
new float[]{0,0,0,1,0,0},
new float[]{0,0,0,0,1,0},
new float[]{0,0,0,0,0,1}});
        
        /*
        //Gilles Khouzams colour corrected grayscale shear
ColorMatrix cm = new ColorMatrix(new float[][]{   new float[]{0.3f,0.3f,0.3f,0,0},
new float[]{0.59f,0.59f,0.59f,0,0},
new float[]{0.11f,0.11f,0.11f,0,0},
new float[]{0,0,0,1,0,0},
new float[]{0,0,0,0,1,0},
new float[]{0,0,0,0,0,1}});
        */

        ImageAttributes ia = new ImageAttributes();
ia.SetColorMatrix(cm);
g.DrawImage(img,new Rectangle(0,0,img.Width,img.Height),0,0,img.Width,img.Height,GraphicsUnit.Pixel,ia);
g.Dispose();
this.BackgroundImage=bm;
}  
}
}


}

相关文章:

​一个参数一张Excel表,玩转Pandas的read_excel()表格读取

作者 | 黄伟呢来源 | 数据分析与统计学之美我觉得很有必要讲述这个文章&#xff0c;进行数据处理的第一步就是Python数据读取。但是你可能没想到&#xff0c;在进行数据读取的同时&#xff0c;我们其实可以配合相关参数做很多事儿&#xff0c;这对于后续的数据处理都是极其有帮…

Android 设计模式:(三)装饰者模式 —— 装饰对象

*利用组合&#xff08;composition&#xff09;和委托&#xff08;delegation&#xff09;可以在运行时实现继承行为的效果&#xff0c;动态地给对象加上新的行为。*利用继承扩展子类的行为&#xff0c;是在编译时静态决定的&#xff1b;利用组合的做法&#xff0c;可以在运行时…

润乾报表永久授权说明

永久授权是什么&#xff1f; 永久授权是运行润乾报表的带有机器特征码的没有时间限制的正式授权文件 2 机器特征码是什么&#xff1f; 机器特征码是为了制作永久授权&#xff0c;由润乾公司提供程序从用户的服务器上获取硬件和操作系统信息&#xff0c;生成的一个数字串&#x…

维度爆炸?Python实现数据压缩如此简单

作者 | 萝卜来源 | 早起Python&#xff08;ID: zaoqi-python&#xff09;用Python基于主成分分析常见的三个应用场景中&#xff0c;其中有一个是「数据描述」&#xff0c;以描述产品情况为例&#xff0c;比如著名的波士顿矩阵&#xff0c;子公司业务发展状况&#xff0c;区域投…

深入剖析C#的多态

作者: 天雨一、什么是多态 面向对象程序设计中的另外一个重要概念是多态性。在运行时&#xff0c;可以通过指向基类的指针&#xff0c;来调用实现派生类中的方法。可以把一组对象放到一个数组中&#xff0c;然后调用它们的方法&#xff0c;在这种场合下&#xff0c;多态性作用…

/usr/local/lib/libz.a: could not read symbols: Bad value(64 位 Linux)

/usr/bin/ld: /usr/local/lib/libz.a(crc32.o): relocation R_X86_64_32 against a local symbol can not be used when making a shared object; recompile with -fPIC /usr/local/lib/libz.a: could not read symbols: Bad value 一般是64 位 电脑才会出现。 解决方法如下&am…

关于BIO | NIO | AIO的讨论

关于BIO | NIO | AIO的讨论一直存在&#xff0c;有时候也很容易让人混淆&#xff0c;就我的理解&#xff0c;给出一个解释&#xff1a; BIO | NIO | AIO&#xff0c;本身的描述都是在Java语言的基础上的。而描述IO&#xff0c;我们需要从两个层面&#xff1a; 编程语言实现原理…

NYOJ-49 开心的小明

开心的小明 时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述小明今天很开心&#xff0c;家里购置的新房就要领钥匙了&#xff0c;新房里有一间他自己专用的很宽敞的房间。更让他高兴的是&#xff0c;妈妈昨天对他说&#xff1a;“你的房间…

两个硬盘和文件相关的小技巧 (C#)

取系统的硬盘分区的盘符&#xff0c;用API函数&#xff1a;GetDriveType [DllImport("kernel32.dll", EntryPoint"GetDriveType")] public static extern int GetDriveType (string nDrive); 调用&#xff1a;string [] dirs Environment.GetLogicalDri…

从数百个Excel中查找数据,一分钟用Python搞定

作者 | 陈熹来源 | 早起Python今天分享一个真实的办公自动化需求&#xff0c;大家一定要仔细阅读需求说明&#xff0c;在理解需求之后即可体会Python的强大。需求说明首先我们来看下今天的需求&#xff0c;有一份档案记录总表的Excel工作簿&#xff0c; 每天会根据当天日期建立…

namenode如何存储复本?

2019独角兽企业重金招聘Python工程师标准>>> namenode如何选择在哪个datanode存储复本&#xff1f;这里需要对可靠性&#xff0c;写入带宽和读取带宽进行权衡。例如&#xff0c;把所有复本都存储在一个节点损失的写入带宽最小&#xff0c;因为复制管线都是在同一节点…

EBS-使用 fnd_user_pkg API 创建用户,添加职责,修改用户

比如有一个外围支持系统&#xff0c;用户需要在外围系统登录之后点个link就可以登录到Oracle ERP系统中&#xff0c;那么我们需要先把外围系统的用户创建在Oracle ERP中&#xff0c;并且分配职责给他。 DECLARE a BOOLEAN; BEGIN---------------------------------------------…

万字长文总结机器学习的模型评估与调参 | 附代码下载

作者 | Sebastian Raschka翻译&整理 | Sam来源 | SAMshare目录一、认识管道流1.1 数据导入1.2 使用管道创建工作流二、K折交叉验证2.1 K折交叉验证原理2.2 K折交叉验证实现三、曲线调参3.1 模型准确度3.2 绘制学习曲线得到样本数与准确率的关系3.3 绘制验证曲线得到超参和准…

[百万级]通用存储过程.分页存储过程

/* 名称:spAll_ReturnRows 输入: 输出: 调用: EXEC spAll_ReturnRows SELECT * FROM 表名, 页号, 返回记录数, 主键, 排序字段 spAll_ReturnRows SELECT * FROM all_Categories,2,10,[ID],[ID] 说明:[百万级]通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录 …

Unsupported major.minor version (jdk版本错误)解决方案

2019独角兽企业重金招聘Python工程师标准>>> 如果你遇到了 Unsupported major.minor version &#xff0c;请认真看一下&#xff0c;说不定会有帮助。 我花两个小时总结的经验&#xff0c;你可能10分钟就得到了。 ^**^ 一、错误现象&#xff1a; 当改变了jdk版本时…

The key of C# 学习笔记I-II

作者 &#xff1a;Kemins booootLog http://blog.csdn.net/keminlau/ Sunday, October 3, 2004 微软提出的CLS(Common Language Specification, 通用语言标准)对能被用来编写dotNET程序的语言的最小功能集做出了规定。 就拿C#来说&#xff0c;它是目前程序设计语言“以效率换安…

分布式平台下的HS(High-Security) --Apache Shiro API(介绍)

在尝试保护你的应用时&#xff0c;你是否有过挫败感?是否觉得现有的Java安全解决方案难以使用&#xff0c;只会让你更糊涂?本文介绍的Apache Shiro&#xff0c;是一个不同寻常的Java安全框架&#xff0c;为保护应用提供了简单而强大的方法。本文还解释了Apache Shiro的项目目…

豪赌 ARM 梦碎:63 岁孙正义的「花甲历险记」

来源 | HyperAI超神经这几天&#xff0c;传出 NVIDIA 将以 400 亿 英镑的价格收购 ARM 的消息&#xff0c;不少媒体在争相报道收购进度的同时&#xff0c;也将整起交易的幕后推手 —— 孙正义&#xff0c;放到了聚光灯下。软银 CEO&#xff0c;传奇投资人&#xff0c;冒险家&am…

Java 集合 — HashMap

HashMap 无序&#xff08;每次resize的时候都会变&#xff09;非线程安全key和value都看可以为null使用数组和链表实现查找元素的时候速度快几个重要属性&#xff1a; loadFactor&#xff1a;用来计算thresholdthreshold&#xff1a;决定map是否需要扩容&#xff0c;threshold …

赠书 | 人工智能识万物:卷积神经网络的前世今生

来源 |《Python人工智能开发从入门到精通》作者 | 杨柳、郭坦、鲁银芝责编 | 晋兆雨深度学习在技术与应用上的突破引发了第三次人工智能浪潮&#xff0c;获得了空前成功。在前述章节的基础上&#xff0c;本章将主要介绍训练卷积神经网络和深度神经网络的重要方法与技巧&#xf…

通过WMI获得硬盘和CPU的物理序列号(VB.net)

作者&#xff1a;iwebsms获得硬盘序列号Dim cmicWmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")Dim Uint32 As UInt32For Each cmicWmiObj As ManagementObject In cmicWmi.GetUint32 cmicWmiObj("signature")…

[转] Zend studio中开发常用

转载自: http://www.cnblogs.com/iphper/archive/2012/03/21/2409397.html 、快捷键设置 在zendstudio中开发的过程中&#xff0c;我们应专注与代码的逻辑中&#xff0c;而不是把一大半的时间都浪费在编辑器的操作以及鼠标的点击中&#xff0c;经常使用快捷键进行操作会达到事半…

程序员新手 0年份等级 指导(一) 开发人员IT架构总览

程序员新手 0年份等级 指导&#xff08;一&#xff09; 开发人员IT架构总览 程序员新手 0年份等级 指导&#xff08;一&#xff09; 开发人员相关IT架构总览之职能分解 开发人员IT架构总览一、职能分解 软件项目的主要组成大体上按照一个项目的生命周期流程分为&#xff1a; 需…

磁盘配额的wmi版本(C#)

作者&#xff1a;iwebsmsusing System;using System.Management;namespace DiskQuota{/// <summary>/// Class1 的摘要说明。/// </summary>class Class1{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(string[] a…

Smarty的配置与高级缓存技术

前言 Smarty 是一个出色的PHP模板引擎&#xff0c;它分离了逻辑代码和user interface。 学习和使用Smarty&#xff0c;没有应用到它的缓存技术是一个很大的损失&#xff0c;它可以将用户最终看到的HMTL文件缓存成一个静态的HTML页&#xff0c;当设定Smarty的cache属性为true时&…

Get了!用Python制作数据预测集成工具 | 附代码

作者 | 李秋键责编 | 晋兆雨大数据预测是大数据最核心的应用&#xff0c;是它将传统意义的预测拓展到“现测”。大数据预测的优势体现在&#xff0c;它把一个非常困难的预测问题&#xff0c;转化为一个相对简单的描述问题&#xff0c;而这是传统小数据集根本无法企及的。从预测…

方差,标准差,协方差、期望值

方差&#xff1a;方差是变量与其平均值的平方和的算术平均值&#xff0c;例如&#xff1a; 有一组数据{4,5,6,7}, 平均值为&#xff1a;(4567)/422/45.5 其方差为&#xff1a;[(4-5.5)2(5-5.5)2(6-5.5)2(7-5.5)2]/4 标准差&#xff1a;方差的开2次方 例如上面那组数据的标准差为…

简单代码的性能差异

《.net 框架程序设计》里的几句代码&#xff0c;我重新整理了一下&#xff0c;写成函数&#xff0c;这样下面的反编译代码看起来更方便点&#xff1a;dahuzizyd的专栏 http://blog.csdn.net/dahuzizyd/publicvoidBoxing() { Int32 v 5; Conso…

求助贴:人工智能offer,阿里or腾讯,选哪个?

笔者曾在脉脉上看到一条网友求助帖&#xff1a;拿到两个offer&#xff0c;一个腾讯&#xff0c;一个阿里&#xff0c;选哪个&#xff1f;抛开“柠檬”这件事不说&#xff0c;笔者观察到另一件事&#xff1a;那就是他的offer都是视觉岗。前一阵刚巧也看到一份报告&#xff1a;人…

EIGRP注入默认路由

实验TOP&#xff1a; 三、实验要求: R1,R2,R3运行EIGRP,用ip default-network 命令使EIGRP向EIGRP域内传递缺省路由,各路由器的各环回口之间路由可达。 四:实验过程: 1、 基本接口的配置.(见图) 1(config)#int e0/0 R1(config-if)#ip add 12.0.0.1 255.255.255.0 R1(config-if)…