1

画像から指定された色 (たとえば赤) を抽出し、この色を含むオブジェクトをトリミングするのに助けが必要です。

この部分は、プロジェクター画面でレーザージェスチャーを追跡する私の卒業プロジェクトで非常に重要です。

4

1 に答える 1

1

正しく理解できたかどうかはわかりませんが、画像の赤い部分だけを表示するコードを次に示します。

200 と比較する場合、> を < に変更することで、赤い部分だけが見えないように変更できます。200 という数字をいじって、is-red チェックに適したしきい値を確認することもできます。

private static unsafe void OnlyRed(Bitmap bitmap, Color replacement)
{
    var redOffset = 0;
    var bpp = 32;
    var bytesRep = new List<byte> {replacement.R, replacement.G, replacement.B};

    switch (bitmap.PixelFormat)
    {
        case PixelFormat.Format24bppRgb:
            bpp = 24;
            break;
        case PixelFormat.Format32bppArgb:
            redOffset = 8;
            bytesRep.Insert(0, replacement.A);
            break;
        case PixelFormat.Format32bppRgb:
        case PixelFormat.Canonical:
            bytesRep.Add(replacement.A);
            break;
        default:
            throw new NotSupportedException("Pixel format unsupported.");
    }

    var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                               ImageLockMode.ReadWrite,
                               bitmap.PixelFormat);

    var start = (byte*)data.Scan0;
    var end = start + data.Height * data.Stride;

    for (var curr = start; curr < end; curr += bpp / 8)
    {
        if (curr[redOffset] > 200)
        {
            continue;
        }

        for (var i = 0; i < bytesRep.Count; i++)
        {
            curr[i] = bytesRep[i];
        }
    }

    bitmap.UnlockBits(data);
}

使用法:

var bitmap = new Bitmap("file location...");
OnlyRed(bitmap, Color.Transparent);
于 2012-04-21T10:46:45.920 に答える