我陷入两难境地。乍一看我的任务很简单,但我肯定有一些麻烦。我有一张图片。灰色图像。我需要获得彩色图像。图片展示最好。
我知道有两种方法可以做到这一点: 1)改变色调, 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");
以下是我从发布的图片中获得的结果
答案 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);
}