C# 如何将颜色更改为另一种黑色,如绿色、红色等

C# 如何将颜色更改为另一种黑色,如绿色、红色等,c#,.net,winforms,qr-code,C#,.net,Winforms,Qr Code,问题 如何将生成qr的颜色更改为红色、绿色或蓝色另一种黑色 我在visual studio 2015 windows窗体应用程序中工作 我使用MessageToolkit库生成qr,它运行良好,没有任何问题 我唯一面临的问题是如何使用MessageToolkit更改二维码的颜色 我的代码 最后更新 我尝试将颜色替换为红色,但结果将所有图像转换为红色 实际上我需要用另一种颜色显示qr 示例代码中的问题是,您正在使用alpha通道来决定是否更改像素。但由于生成的图像是完全不透明的,因此每个像素的al

问题

如何将生成qr的颜色更改为红色、绿色或蓝色另一种黑色

我在visual studio 2015 windows窗体应用程序中工作

我使用MessageToolkit库生成qr,它运行良好,没有任何问题

我唯一面临的问题是如何使用MessageToolkit更改二维码的颜色

我的代码

最后更新

我尝试将颜色替换为红色,但结果将所有图像转换为红色 实际上我需要用另一种颜色显示qr


示例代码中的问题是,您正在使用alpha通道来决定是否更改像素。但由于生成的图像是完全不透明的,因此每个像素的alpha值将为255

边缘的渐变是通过使用适当的RGB颜色来实现的,以实现黑白之间的灰度。如果您只是将代码更改为使用actualColor.R而不是A,它实际上会正确地将黑色部分的颜色更改为红色,但会删除大部分平滑渐变

为了保持渐变,您应该正确地着色图像,而不是在每个像素处使用硬if条件。正确着色意味着将源颜色的每个RGB通道与目标颜色的每个RGB通道相乘

但是,由于您希望只对黑色部分着色,而不对白色部分着色,因此我们需要先反转源图像的颜色。由于黑色表示为RGB 0,0,0,所以将其与目标颜色相乘不会改变任何内容-将任何内容与0相乘仍然是0。另一方面,白色使用RGB 255255,因此它将完全使用目标颜色,而不会以任何方式进行更改。如果颜色介于黑色和白色之间,则可以分别得到源颜色和目标颜色的混合

如果每个颜色通道都表示为0到1范围内的浮点数,则乘法和处理颜色的效果通常会更好,因此我们在乘法之前将源和目标的原始值除以255,然后将其乘以255,将其传递给color.FromARGBint,int,int函数

我使下面的代码示例比需要的更详细,所以事情变得更清楚

public static Bitmap ChangeColor(Bitmap scrBitmap, Color newColor)
{
    // make an empty bitmap the same size as scrBitmap  
    Bitmap newBitmap = new Bitmap(scrBitmap.Width, scrBitmap.Height);
    for (int i = 0; i < scrBitmap.Width; i++) {
        for (int j = 0; j < scrBitmap.Height; j++) {
            // get the pixel from the scrBitmap image  
            var actualColor = scrBitmap.GetPixel(i, j);

            // invert colors, since we want to tint the dark parts and not the bright ones
            var invertedOriginalR = 255 - actualColor.R;
            var invertedOriginalG = 255 - actualColor.G;
            var invertedOriginalB = 255 - actualColor.B;

            // multiply source by destination color (as float channels)
            int r = (invertedOriginalR / 255) * (newColor.R / 255) * 255;
            int g = (invertedOriginalG / 255) * (newColor.G / 255) * 255;
            int b = (invertedOriginalB / 255) * (newColor.B / 255) * 255;
            var tintedColor = Color.FromArgb(r, g, b);
            newBitmap.SetPixel(i, j, tintedColor);
        }
    }
    return newBitmap;
}

可能会替换结果位图中的颜色?如果可能,如何替换颜色?您能帮助medid解决这些问题吗?
public static Bitmap ChangeColor(Bitmap scrBitmap, Color newColor)
{
    // make an empty bitmap the same size as scrBitmap  
    Bitmap newBitmap = new Bitmap(scrBitmap.Width, scrBitmap.Height);
    for (int i = 0; i < scrBitmap.Width; i++) {
        for (int j = 0; j < scrBitmap.Height; j++) {
            // get the pixel from the scrBitmap image  
            var actualColor = scrBitmap.GetPixel(i, j);

            // invert colors, since we want to tint the dark parts and not the bright ones
            var invertedOriginalR = 255 - actualColor.R;
            var invertedOriginalG = 255 - actualColor.G;
            var invertedOriginalB = 255 - actualColor.B;

            // multiply source by destination color (as float channels)
            int r = (invertedOriginalR / 255) * (newColor.R / 255) * 255;
            int g = (invertedOriginalG / 255) * (newColor.G / 255) * 255;
            int b = (invertedOriginalB / 255) * (newColor.B / 255) * 255;
            var tintedColor = Color.FromArgb(r, g, b);
            newBitmap.SetPixel(i, j, tintedColor);
        }
    }
    return newBitmap;
}