如何将部件从一个WriteableBitmap
复制到另一个WriteableBitmap
?我过去曾编写和使用了几十个“copypixel”和透明副本,但我似乎无法找到WPF C#的等价物。
这可能是世界上最难的问题,也可能是最简单的问题,因为绝对没有人用10英尺的杆子接触它。
答案 0 :(得分: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合成。
答案 1 :(得分:2)
似乎没有办法直接从一个复制到另一个,但您可以使用数组和CopyPixels分两步执行此操作,将其从一个中删除,然后WritePixels获取他们进入另一个。
答案 2 :(得分:1)
我同意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(...));
答案 3 :(得分: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);
}