C# 4.0 对象的扩展方法

C# 4.0 对象的扩展方法,c#-4.0,bitmap,extension-methods,C# 4.0,Bitmap,Extension Methods,我感兴趣的是在Bitmap对象上创建一个扩展方法,这样我就可以这样简单地调用它: Bitmap bmp = new Bitmap(...); bmp.GrayScale(); public static void SetGrayPalette(this Bitmap bmpImage) { ColorPalette palette = bmpImage.Palette; Bitmap target = new Bitmap(bmpImage.Width, bmpImage.He

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

Bitmap bmp = new Bitmap(...);
bmp.GrayScale();
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.GrayScale()

它可以工作,但我想消除使用
bmp=bmp。
符号

谢谢

免责声明:我不认为这本身就是一个答案,而只是对代码的修复,它让我头发灰白。
@diiN\u
是对的。我的代码的问题是,在内部,它创建了另一个
位图
对象,基本上是基于该对象对图像进行操作的。然后返回这个对象。灰度未应用于我的原始对象。提供的链接非常有用

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;
}
publicstaticvoidsetgrayPalette(此位图为bmpImage)
{
调色板=bmpImage.palete;
对于(int i=0;i
最初,代码是这样的:

Bitmap bmp = new Bitmap(...);
bmp.GrayScale();
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;
}
publicstaticvoidsetgrayPalette(此位图为bmpImage)
{
调色板=bmpImage.palete;
位图目标=新位图(bmpImage.Width、bmpImage.Height);
对于(int i=0;i
看一下的答案。@diiN\u当我这样做时,我的
bmp.GrayScale()
由于某种原因不会更改调用对象。但是,如果我返回该值并将其分配给我的原始对象
bmp=bmp.GrayScale()
,它就可以工作了。@DanDef不,它不一样。@SollyM我误解了你的要求。您需要确保扩展方法修改传入的
位图
。似乎它当前正在基于原始位图创建一个新的
位图并返回该位图。此代码将不起作用,因为目标和bmp在此处被释放。我想你是想处理旧的
bmp
值。但这是一种糟糕的样式,因为调用方在逻辑上拥有对象。仅供参考。
bmp
未处理。。。它目前正在为我工作。如前所述,最后两行导致bmp和目标中的位图都被释放(它是同一个对象)。你对这些台词有什么看法?天哪。。。。我把这件事搞砸了。。。。哈哈,谢谢你指出这一点。这是
crop
函数,但我需要在这里展示的是
grayscale
函数。我稍后会解决这个问题。