【问题标题】:WPF RenderTargetBitmap with Viewport3DWPF RenderTargetBitmap 与 Viewport3D
【发布时间】:2014-08-08 22:30:52
【问题描述】:

我正在使用 XamlReader 加载 XAML UserControl,然后尝试使用 RenderTargetBitmap 将其转换为图像。

使用简单的 UserControl 就可以正常工作。

但如果我使用这个 Viewport3D,它就不起作用。创建的图像没有 3D 部分...:

    <Viewport3D>
        <ModelVisual3D>
            <ModelVisual3D.Content>
                <GeometryModel3D>
                    <GeometryModel3D.Geometry>
                        <MeshGeometry3D
                            Positions="-0.5  0.5  -0.5,  0.5  0.5  -0.5,
                                       -0.5  0  0.5,  0.5  0  0.5"
                            TriangleIndices=" 0  2  1,  1  2  3"
                            TextureCoordinates="0 0, 1 0, 0 1, 1 1" />
                    </GeometryModel3D.Geometry>

                    <GeometryModel3D.Material>
                        <DiffuseMaterial>
                            <DiffuseMaterial.Brush>
                                <VisualBrush>
                                    <VisualBrush.Visual>
                                        <Button>Hi</Button>
                                    </VisualBrush.Visual>
                                </VisualBrush>
                            </DiffuseMaterial.Brush>
                        </DiffuseMaterial>                              
                    </GeometryModel3D.Material>

                    <!-- Non-Affine Matrix Transform. -->
                    <GeometryModel3D.Transform>
                        <MatrixTransform3D>
                        </MatrixTransform3D>
                    </GeometryModel3D.Transform>

                </GeometryModel3D>
            </ModelVisual3D.Content>
        </ModelVisual3D>

        <!-- Light sources. -->
        <ModelVisual3D>
            <ModelVisual3D.Content>
                <Model3DGroup>
                    <AmbientLight Color="#404040" />
                    <DirectionalLight Color="#C0C0C0" Direction="0 -2 -1" />
                </Model3DGroup>
            </ModelVisual3D.Content>
        </ModelVisual3D>

        <!-- Camera. -->
        <Viewport3D.Camera>
            <PerspectiveCamera Position="0 0.2 1"
                               LookDirection="0 0 -1.5"
                               UpDirection="0 1 0"
                               FieldOfView="100">
            </PerspectiveCamera>
        </Viewport3D.Camera>
    </Viewport3D>

我将 UserControl 转换为图像的方法:

private static byte[] ConvertUserControlToPng(UserControl userControl)
    {
        userControl.Measure(new Size(userControl.Width, userControl.Height));
        userControl.Arrange(new Rect(new Size(userControl.Width, userControl.Height)));
        var renderTargetBitmap = new RenderTargetBitmap((int)(userControl.Width * 300 / 96),
                                                        (int)(userControl.Height * 300 / 96),
                                                        300, 300, PixelFormats.Pbgra32);
        renderTargetBitmap.Render(userControl);
        BitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Clear();
        encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));

        byte[] result;
        using (var stream = new MemoryStream())
        {
            encoder.Save(stream);
            result = stream.ToArray();
        }
        return result;
    }

我错过了什么吗?

【问题讨论】:

    标签: c# wpf xaml rendertargetbitmap


    【解决方案1】:

    我能够在保存到文件的 png 中看到一些可见的东西,我只是在调用 Measure 和 Arrange 之后添加了对 UpdateLayout() 的调用:

    var viewport= (Viewport3D)XamlReader.Parse("... xaml ....");
    
    viewport.Measure(new Size(viewport.Width, viewport.Height));
    viewport.Arrange(new Rect(new Size(viewport.Width, viewport.Height)));
    viewport.UpdateLayout();
    
    var renderTargetBitmap = new RenderTargetBitmap((int)viewport.Width * 300 / 96,
                                                    (int)viewport.Height * 300 / 96,
                                                    300, 300, PixelFormats.Pbgra32);
    
    renderTargetBitmap.Render(viewport);
    BitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Clear();
    encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
    encoder.Save(new FileStream(@"D:\Test.png", FileMode.Create, FileAccess.Write));
    

    【讨论】:

      【解决方案2】:

      所以,我的猜测是它在某种程度上被渲染虚拟化了。也许不是——但我在上面的代码中可以注意到的最好的事情是它使用的是 UserControl——而不是 Control (Viewport3D)。当您运行代码时,它是否完全通过它?还是抛出异常?

      【讨论】:

      • 感谢您的回答。代码无一例外地运行并创建了图像,但没有 ViewPort3d(我在 UserControl 中也有图像)。我还尝试了另一个非常简单的 ViewPort3D,但我遇到了同样的问题......
      猜你喜欢
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2011-06-27
      • 2014-07-31
      相关资源
      最近更新 更多