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