我目前正在尝试使用在 .NET 3.5 SP1 中引入的像素着色器来提高图像处理性能。所有操作都变得更快了,但到目前为止,我只是对我的 WPF 表单中的一些元素应用了效果,而实际上我想避免这种情况。
我们有一堆图像处理功能,我想逐步用像素着色器替换其中的一些内容以提高性能。是否有一种方法可以将这样的像素着色器应用于 ImageSource 而不必显示它?
我目前正在尝试使用在 .NET 3.5 SP1 中引入的像素着色器来提高图像处理性能。所有操作都变得更快了,但到目前为止,我只是对我的 WPF 表单中的一些元素应用了效果,而实际上我想避免这种情况。
我们有一堆图像处理功能,我想逐步用像素着色器替换其中的一些内容以提高性能。是否有一种方法可以将这样的像素着色器应用于 ImageSource 而不必显示它?
//prepare images
img = new Image();
img.Stretch = Stretch.None;
viewbox = new Viewbox();
viewbox.Stretch = Stretch.None;
viewbox.Child = img; //control to render
2. img和viewbox的大小比例正确,还调用了一些布局函数来处理viewbox,这样可以使控件渲染时应用着色器。
/// <summary>
/// Loads the image and viewbox for off-screen rendering.
/// </summary>
public void LoadImage(double width, double height)
{
img.BeginInit();
img.Width = width;
img.Height = height;
img.Source = Source;
img.EndInit();
viewbox.Measure(new Size(img.Width, img.Height));
viewbox.Arrange(new Rect(0, 0, img.Width, img.Height));
viewbox.UpdateLayout();
}
3.获取图像内容,类似于“截屏”:
void SaveUsingEncoder(BitmapEncoder encoder, Stream stream)
{
RenderTargetBitmap bitmap = new RenderTargetBitmap((int)(img.Width * DpiX / WPF_DPI_X), (int)(img.Height * DpiY / WPF_DPI_Y), DpiX, DpiY, PixelFormats.Pbgra32);
bitmap.Render(viewbox);
BitmapFrame frame = BitmapFrame.Create(bitmap);
encoder.Frames.Add(frame);
encoder.Save(stream);
}
thread.SetApartmentState(ApartmentState.STA);
更多信息和演示项目,请参见本文。