我目前正在尝试使用 .net 3.5 sp1 引入的 PixelShaders 来提高图像处理性能。一切都快得多,但直到我刚刚将效果应用于我的 wpf 表单中的某些元素,我实际上想避免。

我们有很多图像处理功能,我想用像素着色器逐个替换其他一些东西以获得一些性能。有没有办法将这样的像素着色器应用于 ImageSource 而无需显示它?

有帮助吗?

解决方案

对于仍然需要这个的人:我刚刚在这里创建了这篇文章,展示了如何在 WPF 中执行此操作。http://www.codeproject.com/Articles/642151/Pixel-shaders-in-a-background-thread-in-WPF

相关代码复制如下。它来自一个带有一些存储变量的类

  • 来源:图像源
  • DpiX、DpiY:包含源 Dpi 的双精度数
  • 图片:WPF 图像控制
  • 视图框:WPF 视图框控件
  • WPF_DPI_X、WPF_DPI_Y:const double 的值是 96.0

1.图像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的大小调整为正确的比例,并且在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);

有关更多信息和演示项目,请参阅文章。

其他提示

看到您还没有从 C# 专家那里得到任何答案,我将尝试从 C++ DirectX 开发人员的角度来解决这个问题,希望如果我的答案没有用,至少它能为您指明正确的方向。我对 C# 知之甚少,对 PixelShaders 的支持方式一无所知,因此机会是完全错误的,我在这里写的内容根本不适用。在这种情况下,请根据需要随意发表评论或否决

在 C++/DirectX 中通常会执行以下操作来实现此目的:

准备工作(一次完成)

  • 使用 CreateRenderTarget 创建渲染目标
  • 使用 CreateOffscreenPlainSurface 创建离屏表面
  • 使用 SetRenderTarget 设置渲染目标表面
  • 创建所需的任何其他输入资源(纹理、顶点缓冲区...)

渲染(多次完成)

  • 根据需要更新输入资源(纹理、缓冲区)
  • 使成为
  • 通过 GetRenderTarget 将渲染目标的内容复制到离屏表面
  • 锁定离屏表面并在CPU上读取其内容
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top