改变灰色图像C#颜色的最佳方法

时间:2014-01-13 13:54:43

标签: c# c#-4.0 drawing gdi+

我陷入两难境地。乍一看我的任务很简单,但我肯定有一些麻烦。我有一张图片。灰色图像。我需要获得彩色图像。图片展示最好。

我知道有两种方法可以做到这一点: 1)改变色调, 2)改变色调(旋转颜色矩阵)

色调改变常见颜色,也改变黑色。所以我相信这种方式不适合我的情况。

色调变化要求基本图像已经着色,但所有图像最初都是灰色(带渐变)。但它可以正常工作。

所以我对解决这个任务的方式感到有些困惑。

可能有其他方法可以做我需要做的事情吗?

非常感谢你的帮助,伙计们! 提前谢谢!

↑这是一个基本图像↑ this is a base image

↑需要类似↑ this is needed to be achieved

↑着色图像↑ tinted image

2 个答案:

答案 0 :(得分:1)

我已经编写了一些代码来将灰度组件传递为黄色(在R和G组件之间共享)我已经得到了足够接近的结果,您需要做的就是使用R和G组件比率来获得你需要的黄色程度。您还需要更多地了解如何处理对象底部的阴影。

// Load image   
Bitmap bm = new Bitmap("D:\\a.png");

for (int i = 0; i < bm.Width; i++)
{
    for (int j = 0; j < bm.Height; j++)
    {
        // Handles transparent pixles
        if (bm.GetPixel(i, j).R == 0 & bm.GetPixel(i, j).G == 0 & bm.GetPixel(i, j).B == 0 & bm.GetPixel(i, j).A == 0) bm.SetPixel(i, j, Color.Transparent);
        // Passes the grey component of the grescale image to R and G compenents and changes pixle color
        else bm.SetPixel(i, j, Color.FromArgb(bm.GetPixel(i, j).R, bm.GetPixel(i, j).R, 0));
    }
}

// Save image
bm.Save("D:\\b.png");

以下是我从发布的图片中获得的结果

enter image description here

答案 1 :(得分:0)

我写了两个完成这项工作的方法。您可以设置希望图像混合的任何颜色。

    private void ApplyColor(Bitmap bm, Color userColor)
    {
        if (bm==null)
            return;

        // pixels loop  
        for (int i = 0; i < bm.Width; i++)
        {
            for (int j = 0; j < bm.Height; j++)
            {
                // get current pixel
                Color curPix = bm.GetPixel(i, j);
                Color curPixColor = Color.FromArgb(curPix.A, curPix.R, curPix.G, curPix.B);

                // get result color by blending 
                Color resultColor = Blend(curPixColor, userColor, ColorMixFactor);

                //  set pixel color
                bm.SetPixel(i, j, resultColor);
            }
        }
    }

    public static Color Blend(Color srcColor, Color dstColor, double amount)
    {
        // restrict black (dark) color from being affected by the blending
        var br = srcColor.GetBrightness();
        if (br < BrightnessToAvoid)
            return srcColor;

        // get all 4 color channels 
        var r = (byte) ((srcColor.R*amount) + dstColor.R*(1 - amount));
        var g = (byte) ((srcColor.G*amount) + dstColor.G*(1 - amount));
        var b = (byte) ((srcColor.B*amount) + dstColor.B*(1 - amount));
        var a = srcColor.A;

        // get blended color
        return Color.FromArgb(a, r, g, b);
    }