使用System.Windows.Media.Imaging复合两个位图

时间:2010-11-22 23:32:22

标签: c# .net wpf image-processing

我正在尝试使用System.Windows.Media.Imaging将相同大小和格式的两个位图组合成相同大小和格式的第三个文件。我在WPF(处理LINQPad中的代码)的上下文之外这样做,因为打算将其作为ASP.net应用程序的一部分来替代不受支持的System.Drawing。

// load the files
var layerOne = new BitmapImage(new Uri(layerOneFile, UriKind.Absolute));
var layerTwo = new BitmapImage(new Uri(layerTwoFile, UriKind.Absolute));

// create the destination based upon layer one
var composite = new WriteableBitmap(layerOne);

// copy the pixels from layer two on to the destination
int[] pixels = new int[(int)layerTwo.Width * (int)layerTwo.Height];
int stride = (int)(4 * layerTwo.Width);
layerTwo.CopyPixels(pixels, stride, 0);
composite.WritePixels(Int32Rect.Empty, pixels, stride, 0);

// encode the bitmap to the output file
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(composite));
using (var stream = new FileStream(outputFile, FileMode.Create))
{
    encoder.Save(stream);
}

这会创建一个与从layerOne加载的文件相同的文件,我期望的是layerTwo将叠加在layerOne上。似乎正在发生的事情是数据被写入BackBuffer但从未被渲染到位图上......大概这是调度员通常会做的事情。

我哪里错了?我怎样才能回到正轨?

1 个答案:

答案 0 :(得分:3)

问题在于WritePixels的第一个参数,它指示要更新的WriteableBitmap的区域。

而不是Int32Rect.Empty,您可以执行以下操作,并且应该看到第一个图像写在第一个图像上:

Int32Rect sourceRect = new Int32Rect(0, 0, (int)layerTwo.Width, (int)layerTwo.Height);
composite.WritePixels(sourceRect, pixels, stride, 0);