1

你将如何将一个部分从一个复制WriteableBitmap到另一个WriteableBitmap?我过去编写并使用了几十个“copypixel”和透明副本,但我似乎找不到 WPF C# 的等价物。

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

4

4 回答 4

3

使用http://writeablebitmapex.codeplex.com/ 中的 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 以获得更高的性能。使用 Additive 时,您可以在源和目标之间进行 alpha 合成。

于 2013-07-31T17:56:34.530 回答
2

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

于 2013-07-19T22:02:57.853 回答
1

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

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

请注意,您的SrcImgWriteableBitmap 必须是 Pbgra32 格式才能由 WriteableBitmapEx 库进行操作。如果您的位图不是这种形式,那么您可以在裁剪之前轻松转换它:

var tmp = BitmapFactory.ConvertToPbgra32Format(SrcImg);
var DstImg = tmp.Crop(new Rect(...));
于 2014-01-09T17:59:57.520 回答
1
 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);
    }
于 2014-09-08T14:15:49.097 回答