使用位图和 ARGB 扫描图像中的红色 - C#
Scanning for Red Colors in an Image with Bitmap and ARGB - C#
我正在拍照并检查其中是否有任何红色阴影。红色阴影图像中至少有一个像素应该 return 为真。在我的解决方案中,并未涵盖所有红色阴影。我使用位图检查图像中的每个像素。这是我试过的代码:
public bool HasRedColor(string imagePath)
{
if(imagePath != null)
{
var image = Image.FromFile(imagePath);
var redColors = TakeRed();
Bitmap bmp = new Bitmap(imagePath, true);
for (int i = 0; i < image.Height; i++)
{
for (int j = 0; j < image.Width; j++)
{
//Get the color at each pixel
Color pixelColor = bmp.GetPixel(j, i);
//Compare Pixel's Color ARGB property with the picked color's ARGB property
if (redColors.Any(x => x == pixelColor))
{
return true;
}
}
}
return false;
}
return false;
}
public List<Color> TakeRed()
{
var listOfRedColors = new List<Color>();
for (int i = 150; i < 255; i++)
{
listOfRedColors.Add(Color.FromArgb(255, i, 0, 0));
}
return listOfRedColors;
}
}
但是,我的函数 TakeRed() 并未涵盖所有红色阴影。关于如何获得所有红色阴影的任何建议?
您所做的是创建一个红色列表,但它是不完整的。您没有考虑 G 和 B 值。如果它们不是 0,但是,比方说,1。这也可以被认为是红色,R 值从 150 到 255。所以你需要附加你的列表,直到你有所有红色阴影。我认为设置范围可能非常主观。
但是!
要将您认为是红色的所有颜色放入列表中并每次遍历列表,您需要检查颜色是否为红色是非常低效的。而是设置范围。例如,如果您说 R 值大于 150 且 G 和 B 值小于 20 的每种颜色,解决方案可能如下所示。
public bool isRed(Color pixelColor)
{
if (pixelColor.R > 0x96 && pixelColor.G < 0x14 && pixelColor.B < 0x14)
{
return true;
}
return false;
}
您正在分别检查 R、G 和 B 值是否在范围内。 R、G 和 B 是 byte 类型。您可以使用十六进制值来设置范围。
我正在拍照并检查其中是否有任何红色阴影。红色阴影图像中至少有一个像素应该 return 为真。在我的解决方案中,并未涵盖所有红色阴影。我使用位图检查图像中的每个像素。这是我试过的代码:
public bool HasRedColor(string imagePath)
{
if(imagePath != null)
{
var image = Image.FromFile(imagePath);
var redColors = TakeRed();
Bitmap bmp = new Bitmap(imagePath, true);
for (int i = 0; i < image.Height; i++)
{
for (int j = 0; j < image.Width; j++)
{
//Get the color at each pixel
Color pixelColor = bmp.GetPixel(j, i);
//Compare Pixel's Color ARGB property with the picked color's ARGB property
if (redColors.Any(x => x == pixelColor))
{
return true;
}
}
}
return false;
}
return false;
}
public List<Color> TakeRed()
{
var listOfRedColors = new List<Color>();
for (int i = 150; i < 255; i++)
{
listOfRedColors.Add(Color.FromArgb(255, i, 0, 0));
}
return listOfRedColors;
}
}
但是,我的函数 TakeRed() 并未涵盖所有红色阴影。关于如何获得所有红色阴影的任何建议?
您所做的是创建一个红色列表,但它是不完整的。您没有考虑 G 和 B 值。如果它们不是 0,但是,比方说,1。这也可以被认为是红色,R 值从 150 到 255。所以你需要附加你的列表,直到你有所有红色阴影。我认为设置范围可能非常主观。
但是! 要将您认为是红色的所有颜色放入列表中并每次遍历列表,您需要检查颜色是否为红色是非常低效的。而是设置范围。例如,如果您说 R 值大于 150 且 G 和 B 值小于 20 的每种颜色,解决方案可能如下所示。
public bool isRed(Color pixelColor)
{
if (pixelColor.R > 0x96 && pixelColor.G < 0x14 && pixelColor.B < 0x14)
{
return true;
}
return false;
}
您正在分别检查 R、G 和 B 值是否在范围内。 R、G 和 B 是 byte 类型。您可以使用十六进制值来设置范围。