问题
如何将生成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
答案 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;
}