首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用C#中的代码进行颜色提取?

如何使用C#中的代码进行颜色提取?
EN

Stack Overflow用户
提问于 2012-04-21 17:38:49
回答 1查看 1K关注 0票数 1

我需要帮助从图像中提取指定的颜色(例如红色),然后裁剪包含此颜色的对象。

这部分在我的毕业设计中是非常重要的,那就是在投影仪屏幕上跟踪激光手势。

EN

回答 1

Stack Overflow用户

发布于 2012-04-21 18:46:46

我真的不确定我是否正确理解了你的意思,但这里有一个代码,它只使图像的红色部分可见。

当与200相比时,您可以通过将>更改为<来将其更改为仅红色部分不可见。你也可以使用数字200来看看什么阈值对你的is-red检查有好处。

代码语言:javascript
复制
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);
}

用法:

代码语言:javascript
复制
var bitmap = new Bitmap("file location...");
OnlyRed(bitmap, Color.Transparent);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10257831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档