如何:修剪颜色

切变可按照与另一个颜色分量成比例的量增加或减少某个颜色分量。 例如,假设有一种转换将红色分量增加蓝色分量值的一半。 在这种转换下,颜色 (0.2, 0.5, 1) 将变为 (0.7, 0.5, 1)。 新的红色分量为 0.2 + (1/2)(1) = 0.7。

示例

以下示例从 ColorBars4.bmp 文件构造 Image 对象。 然后,代码将上一段中所述的切变转换应用于图像中的每一个像素。

下图左侧显示原始图像,右侧显示切变后的图像:

Two squares with colored stripes side-by-side illustrating the original image and the sheared image.

下表列出了切变转换前后四条色带的颜色矢量。

原始 切变后
(0, 0, 1, 1) (0.5, 0, 1, 1)
(0.5, 1, 0.5, 1) (0.75, 1, 0.5, 1)
(1, 1, 0, 1) (1, 1, 0, 1)
(0.4, 0.4, 0.4, 1) (0.6, 0.4, 0.4, 1)
Image image = new Bitmap("ColorBars.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.5f,  0,  1,  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);
Dim image = New Bitmap("ColorBars.bmp")
Dim imageAttributes As New ImageAttributes()
Dim width As Integer = image.Width
Dim height As Integer = image.Height

Dim colorMatrixElements As Single()() = _
    {New Single() {1, 0, 0, 0, 0}, _
        New Single() {0, 1, 0, 0, 0}, _
        New Single() {0.5F, 0, 1, 0, 0}, _
        New Single() {0, 0, 0, 1, 0}, _
        New Single() {0, 0, 0, 0, 1}}

Dim colorMatrix As 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), 0, 0, _
    width, height, GraphicsUnit.Pixel, imageAttributes)

编译代码

前面的示例专用于 Windows 窗体,它需要 PaintEventArgse,后者是 Paint 事件处理程序的参数。 将 ColorBars.bmp 替换为系统中有效的图像名称和路径。

另请参阅