【问题标题】:Extension method on Objects对象的扩展方法
【发布时间】:2016-11-08 13:48:57
【问题描述】:

我有兴趣在 Bitmap 对象上创建一个扩展方法,这样我就可以像这样简单地调用它:

Bitmap bmp = new Bitmap(...);
bmp.GrayScale();

得到的bmp是灰度的。

目前我有一个扩展方法Bitmap GrayScale(this Bitmap bmp),但要使用它我不得不说bmp = bmp.GrayScale()

它有效,但我想使用bmp = bmp. 表示法消除。

谢谢

【问题讨论】:

  • 看看this post的答案。
  • @diiN_ 当我这样做时,我的 bmp.GrayScale() 出于某种原因不会更改调用对象。但是,如果我返回该值并将其分配给我的原始对象 bmp = bmp.GrayScale() 它可以工作。
  • @DanDef 不,不一样。
  • @SollyM 我误解了你在问什么。您需要确保扩展方法修改了传入的Bitmap。它似乎正在根据原始创建一个新的Bitmap并返回它。

标签: c#-4.0 bitmap extension-methods


【解决方案1】:
免责声明:我不认为这本身就是一个答案,而只是修复了让我白发苍苍的代码。

@diiN_ 是对的。我的代码的问题在于,它在内部创建了另一个 Bitmap 对象,该对象基本上是图像操作的基础。然后返回这个对象。灰度未应用于我的原始对象。提供的链接很有帮助。

public static void SetGrayPalette(this Bitmap bmpImage)
{
    ColorPalette palette = bmpImage.Palette;
    for (int i = 0; i < palette.Entries.Length; i++)
    {
        palette.Entries[i] = Color.FromArgb(i, i, i);
    }
    bmpImage.Palette = palette;
}

原来的代码是这样的:

public static void SetGrayPalette(this Bitmap bmpImage)
{
    ColorPalette palette = bmpImage.Palette;
    Bitmap target = new Bitmap(bmpImage.Width, bmpImage.Height);
    for (int i = 0; i < palette.Entries.Length; i++)
    {
        palette.Entries[i] = Color.FromArgb(i, i, i);
    }
    target.Palette = palette;
    return target;
}

【讨论】:

  • 此代码将不起作用,因为目标 和 bmp 已设置在此处。我认为您打算处理旧的 bmp 值。但这是不好的风格,因为调用者在逻辑上拥有该对象。仅供参考。
  • bmp 未处理...它目前正在为我工​​作。
  • 正如最后两行所写的那样,导致 bmp 和目标中的位图被释放(它是同一个对象)。您对这些线路的作用有何看法?
  • 天哪……我把这个搞砸了……哈哈谢谢你指出来。这是crop 函数,但我需要在这里展示的是grayscale 函数。我稍后会解决这个问题。
猜你喜欢
  • 2015-05-08
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2012-07-05
  • 2012-06-10
  • 1970-01-01
相关资源
最近更新 更多