【发布时间】:2019-12-09 21:57:05
【问题描述】:
假设,这是图像,我想得到图像内部的颜色。(结果应该是上图的红色)这个颜色可能在图像中的不同位置。因为我不知道颜色开始的确切位置,所以我无法得到准确的结果。
到目前为止,我裁剪图像,手动给出 x 和 y 的位置,然后裁剪图像,得到裁剪图像的平均颜色。但我知道,这不是确切的颜色。
我尝试了什么:
private RgbDto GetRGBvalueCroppedImage(Image croppedImage)
{
var avgRgb = new RgbDto();
var bm = new Bitmap(croppedImage);
BitmapData srcData = bm.LockBits(
new Rectangle(0, 0, bm.Width, bm.Height),
ImageLockMode.ReadOnly,
PixelFormat.Format32bppArgb);
int stride = srcData.Stride;
IntPtr Scan0 = srcData.Scan0;
long[] totals = new long[] { 0, 0, 0 };
int width = bm.Width;
int height = bm.Height;
unsafe
{
byte* p = (byte*)(void*)Scan0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
for (int color = 0; color < 3; color++)
{
int idx = (y * stride) + x * 4 + color;
totals[color] += p[idx];
}
}
}
}
avgRgb.avgB = (int)totals[0] / (width * height);
avgRgb.avgG = (int)totals[1] / (width * height);
avgRgb.avgR = (int)totals[2] / (width * height);
return avgRgb;
}
如何获得精确的裁剪位置?可能我可以将图像转换为字节数组,然后我可以找到不同的颜色并对其进行定位然后裁剪。但我不知道如何做到这一点。
【问题讨论】:
-
你保证图片中正好有2种颜色吗?
-
你能举个真实的例子吗?真的是单色图像和一个矩形区域吗?
-
无法理解您想要达到的目标。你说“结果应该是上面图像的红色”,然后你问“我怎样才能得到精确的裁剪位置?”。所以... 你真正想要什么?你必须至少知道一些事情才能使用
-
所有盒子都有“典型”颜色吗?或者它们也可以有不同的颜色?标签是否有平均尺寸范围?或者它们可以是图像的 0% 到 100% 的任何内容吗?