使用矩阵转换来调整颜色

缩放变换是指用一个数字与这四个颜色分量中的一个或多个相乘。 下表给出表示缩放的颜色矩阵项。

要缩放的分量矩阵项
Red[0][0]
绿色[1][1]
蓝色[2][2]
Alpha[3][3]

缩放一种颜色

下面的示例从文件 ColorBars2.bmp 构造一个 Image 对象。 然后,代码将图像中每个像素的蓝色分量乘以 2。 原来的图像绘制在变换后的图像旁边。

C#

VB

Image image = new Bitmap(“ColorBars2.bmp”);
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = {
   new float[] {1,  0,  0,  0, 0},
   new float[] {0,  1,  0,  0, 0},
   new float[] {0,  0,  2,  0, 0},
   new float[] {0,  0,  0,  1, 0},
   new float[] {0, 0, 0, 0, 1}};

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

e.Graphics.DrawImage(image, 10, 10, width, height);

e.Graphics.DrawImage(
   image,
   new Rectangle(150, 10, width, height),  // destination rectangle
   0, 0,        // upper-left corner of source rectangle
   width,       // width of source rectangle
   height,      // height of source rectangle
   GraphicsUnit.Pixel,
   imageAttributes);

下面的插图在左侧显示原来的图像,在右侧显示缩放后的图像。

下表列出在进行蓝色缩放前后,四栏的颜色矢量。 请注意,第四个颜色栏中的蓝色分量从 0.8 变到 0.6。 这是因为 GDI+ 只保留结果的小数部分。 例如,(2)(0.8) = 1.6,1.6 的小数部分是 0.6。 只保留小数部分可确保结果总是在 [0, 1] 之间。

Original缩放后
(0.4, 0.4, 0.4, 1)(0.4, 0.4, 0.8, 1)
(0.4, 0.2, 0.2, 1)(0.4, 0.2, 0.4, 1)
(0.2, 0.4, 0.2, 1)(0.2, 0.4, 0.4, 1)
(0.4, 0.4, 0.8, 1)(0.4, 0.4, 0.6, 1)

缩放多种颜色

下面的示例从文件 ColorBars2.bmp 构造一个 Image 对象。 然后,该代码缩放图像中每个像素的红色、绿色和蓝色分量。 红色分量缩小了 25%,绿色分量缩小了 35%,蓝色分量缩小了 50%。

VB

Image image = new Bitmap(“ColorBars.bmp”);
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = {
   new float[] {.75F,  0,  0,  0, 0},
   new float[] {0,  .65F,  0,  0, 0},
   new float[] {0,  0,  .5F,  0, 0},
   new float[] {0,  0,  0,  1F, 0},
   new float[] {0, 0, 0, 0, 1F}};

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

e.Graphics.DrawImage(image, 10, 10, width, height);

e.Graphics.DrawImage(
   image,
   new Rectangle(150, 10, width, height),  // destination rectangle
   0, 0,        // upper-left corner of source rectangle
   width,       // width of source rectangle
   height,      // height of source rectangle
   GraphicsUnit.Pixel,
   imageAttributes);

下面的插图在左侧显示原来的图像,在右侧显示缩放后的图像。

下表列出在缩放红色、绿色和蓝色前后,四栏的颜色矢量。

Original缩放后
(0.6, 0.6, 0.6, 1)(0.45, 0.39, 0.3, 1)
(0, 1, 1, 1)(0, 0.65, 0.5, 1)
(1, 1, 0, 1)(0.75, 0.65, 0, 1)
(1, 0, 1, 1)(0.75, 0, 0.5, 1)

百度大模型

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

腾讯云图