如何改变颜色qr生成另一种颜色的黑色像绿色红色等

时间:2017-03-11 18:41:06

标签: c# .net winforms qr-code

问题

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

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

我使用消息工具包库生成qr,它运行良好,没有任何问题

我只会遇到如何使用消息工具包更改颜色qr代码的问题

我的代码

上次更新

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

MessagingToolkit.QRCode.Codec.QRCodeEncoder encoder = new MessagingToolkit.QRCode.Codec.QRCodeEncoder();
                    encoder.QRCodeScale = 8;
                    Bitmap bmp = ChangeColor(encoder.Encode(textBox1.Text), Color.Red);
                    pictureBox1.Image = bmp;
                    bmp.Save(sv.FileName, ImageFormat.Jpeg);
 public static Bitmap ChangeColor(Bitmap scrBitmap, Color color)
        {
            //You can change your new color here. Red,Green,LawnGreen any..  
            Color newColor = color;
            Color actualColor;
            //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  
                    actualColor = scrBitmap.GetPixel(i, j);
                    // > 150 because.. Images edges can be of low pixel colr. if we set all pixel color to new then there will be no smoothness left.  
                    if (actualColor.A > 150)
                        newBitmap.SetPixel(i, j, newColor);
                    else
                        newBitmap.SetPixel(i, j, actualColor);
                }
            }
            return newBitmap;
        }
    Result wrong result

1 个答案:

答案 0 :(得分:1)

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

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

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

但是,由于您希望仅对暗部分而不是白色部分着色,我们需要先反转源图像颜色。由于黑色表示为RGB(0,0,0),将其与目标颜色相乘不会改变任何东西 - 将任何数字乘以0仍为0.另一方面,白色使用RGB(255,255,255),因此它将完全使用目标颜色(不以任何方式更改)。如果它是黑白之间的任何东西,你可以得到源和目标颜色的相应混合。

如果每个颜色通道表示为0到1范围内的浮点数,则乘法(并且一般处理颜色)效果更好,因此我们在乘法和乘法之前将源和目标的原始值除以255然后将它传递给255以将其传递给Color.FromARGB(int,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;
}