Для кого это еще нужно: Я только что создал эту статью здесь, где показано, как это сделать в WPF. http://www.codeproject.com/Articles/642151/Pixel-shaders-in-a-background-thread-in-WPF
Соответствующий код, скопированный ниже. она из класса с некоторыми сохраненных переменных
- Источник: ImageSource
- DPix, DpiY: двойники, содержащие ДПИ источника
- IMG: WPF управления Image
- ViewBox: WPF управления ViewBox
- WPF_DPI_X, WPF_DPI_Y: Const удваивается со значением 96,0
1.the Image IMG встраивается в Viewbox (также офф-экрана)
//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 имеют размер до нужных пропорций, а также некоторые функции макета вызываются в окне просмотра. это сделает рендеринг элементов управления с примененным шейдером.
/// <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.And, чтобы получить содержание изображения, в «кадр», если вы:
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);
для получения дополнительной информации и демонстрационного проекта см. в статье.