首页 > 开发 > 综合 > 正文

[GDI+] ColorMatrix 彩色矩阵

2024-07-21 02:17:08
字体:
来源:转载
供稿:网友

首先对装配脑袋给出上两片文章的友好回复,还有网友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+ 提供用于存储和操作图像的 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 矩阵应用任何组合形式的线性变换和平移。由线性变换组成的后跟平移的变换称为仿射变换。

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


在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;
}
}
}
}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表