【问题标题】:Delegate returns right color, but still wrong代表返回正确的颜色,但仍然错误
【发布时间】:2011-01-13 14:00:15
【问题描述】:

我有一个代表

private delegate Color ColorDel(int x, int y);

返回一个点的颜色,用于Bitmap.GetPixel(x,y)

即使我之前直接将颜色放入位图中,作为Color.Red, 返回颜色与所有 ARGB 相同,但不在名称上,即 ffff0000 而不是 Color.Red 实际上的红色。 ToKnownColor 也不行。

对此事有何意见?

编辑,代码:

class ColorDelegateTest
    {
        private delegate Color ColorDel(int x, int y);

        private static bool FoundColor(int x, int y, Color color, ColorDel dlgt)
        {
            var theColor = dlgt.Invoke(x, y);
            //theColor = "{Name=ffff0000, ARGB=(255, 255, 0, 0)}"
            //Color.Red = "{Name=Red, ARGB=(255, 255, 0, 0)}"
            var r = dlgt.Invoke(x, y) == color; //False
            var t = dlgt.Invoke(x, y) == Color.FromArgb(255, 255, 0, 0); //True
            var f = dlgt.Invoke(x, y) == Color.Red; //False
            if (r || t || f)
                return true;
            return false;
        }
        private static void ItterateColors()
        {
            int xMax = 300;
            int yMax = 300;
            Bitmap bmp = new Bitmap(xMax, yMax);

            ColorDel colorDelegate = new ColorDel(bmp.GetPixel);

            for (int x = 0; x < xMax; x++)
                for (int y = 0; y < yMax; y++)
                {
                    bmp.SetPixel(x, y, Color.Red);
                    FoundColor(x, y, Color.Red, colorDelegate);
                }
        }
    }

埃里克

【问题讨论】:

  • 如果您可以发布实际代码(而不仅仅是委托声明),这将更容易为您提供帮助。
  • 顺便说一句,这与使用委托无关。您可以通过尝试直接使用GetPixel 轻松测试自己。
  • 是的,我应该先检查底层函数,看看它是否正常运行。

标签: c# colors bitmap


【解决方案1】:

Color.Red 包含一个表示它是已知颜色的位,而 Color.FromArgb(255, 0, 0) 没有,因此它们不相等。进行比较的一种方法是与.ToArgb() 进行比较:

dlgt.Invoke(x, y).ToArgb() == Color.Red.ToArgb()

【讨论】:

  • 谢谢,没想到!
【解决方案2】:

尝试使用 Color.FromName("Red") 代替 Color.Red

附:如果有更详细的问题,会很有帮助的回答

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    相关资源
    最近更新 更多