C# 如何将writeablebitmap的一部分复制到另一个writeablebitmap?

C# 如何将writeablebitmap的一部分复制到另一个writeablebitmap?,c#,writeablebitmap,C#,Writeablebitmap,如何将零件从一个WriteableBitmap复制到另一个WriteableBitmap?在过去,我已经编写并使用了几十个“copypixel”和透明副本,但我似乎找不到WPF C#的等效副本 这要么是世界上最难的问题,要么是最简单的问题,因为绝对没有人用十英尺长的杆子去碰它。似乎没有一种方法可以直接从一个复制到另一个,但你可以使用数组分两步完成,将它们从一个复制到另一个复制。没有这似乎是一种直接从一个复制到另一个的方法,但您可以使用数组分两步进行复制,将它们从一个数组中取出,然后放入另一个数组

如何将零件从一个
WriteableBitmap
复制到另一个
WriteableBitmap
?在过去,我已经编写并使用了几十个“copypixel”和透明副本,但我似乎找不到WPF C#的等效副本


这要么是世界上最难的问题,要么是最简单的问题,因为绝对没有人用十英尺长的杆子去碰它。

似乎没有一种方法可以直接从一个复制到另一个,但你可以使用数组分两步完成,将它们从一个复制到另一个复制。

没有这似乎是一种直接从一个复制到另一个的方法,但您可以使用数组分两步进行复制,将它们从一个数组中取出,然后放入另一个数组中。

使用WriteableBitmapEx from 然后使用如下所示的Blit方法

    private WriteableBitmap bSave;
    private WriteableBitmap bBase;

    private void test()
    {
        bSave = BitmapFactory.New(200, 200); //your destination
        bBase = BitmapFactory.New(200, 200); //your source
        //here paint something on either bitmap.
        Rect rec = new Rect(0, 0, 199, 199);
        using (bSave.GetBitmapContext())
        {
            using (bBase.GetBitmapContext())
            {
                bSave.Blit(rec, bBase, rec, WriteableBitmapExtensions.BlendMode.Additive);
            }
        }
    }

如果不需要在目标中保留任何信息,可以使用BlendMode.None以获得更高的性能。使用加法器时,可以在源和目标之间进行alpha合成。

使用来自的WriteableBitmapEx 然后使用如下所示的Blit方法

    private WriteableBitmap bSave;
    private WriteableBitmap bBase;

    private void test()
    {
        bSave = BitmapFactory.New(200, 200); //your destination
        bBase = BitmapFactory.New(200, 200); //your source
        //here paint something on either bitmap.
        Rect rec = new Rect(0, 0, 199, 199);
        using (bSave.GetBitmapContext())
        {
            using (bBase.GetBitmapContext())
            {
                bSave.Blit(rec, bBase, rec, WriteableBitmapExtensions.BlendMode.Additive);
            }
        }
    }

如果不需要在目标中保留任何信息,可以使用BlendMode.None以获得更高的性能。当使用加法器时,您可以在源和目标之间进行alpha合成。

我同意上面的Guy的观点,最简单的方法就是简单地使用WriteableBitmapEx库;但是,Blit函数用于合成前景和背景图像。将一个WriteableBitmap的一部分复制到另一个WriteableBitmap的最有效方法是使用Crop函数:

var DstImg = SrcImg.Crop(new Rect(...));
请注意,您的
SrcImg
WriteableBitmap必须采用Pbgra32格式,以便WriteableBitmapEx库对其进行操作。如果位图不是此格式,则可以在剪切前轻松转换:

var tmp = BitmapFactory.ConvertToPbgra32Format(SrcImg);
var DstImg = tmp.Crop(new Rect(...));

我同意上面盖伊的观点,最简单的方法就是简单地使用WriteableBitmapEx库;但是,Blit函数用于合成前景和背景图像。将一个WriteableBitmap的一部分复制到另一个WriteableBitmap的最有效方法是使用Crop函数:

var DstImg = SrcImg.Crop(new Rect(...));
请注意,您的
SrcImg
WriteableBitmap必须采用Pbgra32格式,以便WriteableBitmapEx库对其进行操作。如果位图不是此格式,则可以在剪切前轻松转换:

var tmp = BitmapFactory.ConvertToPbgra32Format(SrcImg);
var DstImg = tmp.Crop(new Rect(...));

你的意思是使用
CopyPixels
/
WritePixels
组合?这样行吗?我从来没有见过这样做,我一直在寻找。你是说用
CopyPixels
/
WritePixels
组合键怎么做?这样行吗?我从来没有见过这样做,我一直在寻找。你会怎么做?