如何将可写位图的一部分复制到另一个可写位图

本文关键字:位图 复制 另一个 一部分 | 更新日期: 2023-09-27 18:23:53

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

这要么是世界上最难的问题,要么是最容易的问题,因为绝对没有人会用十英尺高的杆子碰它。

如何将可写位图的一部分复制到另一个可写位图

从中使用WriteableBitmapExhttp://writeablebitmapex.codeplex.com/然后使用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合成。

似乎没有直接从一个阵列复制到另一个阵列的方法,但您可以分两步完成,使用数组和CopyPixels将它们从一个中复制出来,然后使用WritePixels使它们进入另一个。

我同意Guy的观点,即最简单的方法是简单地使用WriteableBitmapEx库;然而,Blit函数用于合成前景和背景图像。将一个可写位图的一部分复制到另一个可写入位图的最有效方法是使用Crop函数:

var DstImg = SrcImg.Crop(new Rect(...));

请注意,您的SrcImg WriteableBitmap必须是Pbgra32格式,才能由WriteableBitmapEx库进行操作。如果你的位图不是这种形式的,那么你可以很容易地在裁剪前进行转换:

var tmp = BitmapFactory.ConvertToPbgra32Format(SrcImg);
var DstImg = tmp.Crop(new Rect(...));
 public static void CopyPixelsTo(this BitmapSource sourceImage, Int32Rect sourceRoi, WriteableBitmap destinationImage, Int32Rect destinationRoi)
    {
        var croppedBitmap = new CroppedBitmap(sourceImage, sourceRoi);
        int stride = croppedBitmap.PixelWidth * (croppedBitmap.Format.BitsPerPixel / 8);
        var data = new byte[stride * croppedBitmap.PixelHeight];
        // Is it possible to Copy directly from the sourceImage into the destinationImage?
        croppedBitmap.CopyPixels(data, stride, 0);
        destinationImage.WritePixels(destinationRoi,data,stride,0);
    }