簡體   English   中英

ViewPort3D外部的RenderTargetBitmap和Viewport3D渲染邊距

[英]RenderTargetBitmap and Viewport3D rendering margin outside the ViewPort3D

奇怪的問題,但是我發現RenderTargetBitmap函數正在向ViewPort3D的左側渲染邊距。 當我保存位圖(在這種情況下為PNG)時,最終圖像的左側有一個縫隙,而右側則被切掉了相同的量。 ViewPort3D的尺寸為550像素高x 1024像素寬。 我在RenderTargetBitmap方法中使用相同的尺寸。 我很困惑為什么它超出了定義的范圍。

    <Grid>
    <Button Content="Save Snapshot" HorizontalAlignment="Left" Name="btnSaveSnapshot"  VerticalAlignment="Top" Width="100" Margin="8,8,0,0"/>
    <Viewport3D Name="vp3dTiles" Height="550" Width="1024" UseLayoutRounding="True"  HorizontalAlignment="Center" VerticalAlignment="Bottom" >
        <Viewport3D.Camera>
            <PerspectiveCamera Position="384,1750,174" LookDirection="0,-.65,-0.25"  UpDirection="0,0,1"  FieldOfView="65"/>
        </Viewport3D.Camera>
        <ModelVisual3D>
            <ModelVisual3D.Content>
                <Model3DGroup>
                    <AmbientLight Color="white" />
                    <GeometryModel3D>
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D Positions="0,0,0 768,0,0 768,1408,0 0,1408,0 " TriangleIndices="0 1 3 1 2 3" TextureCoordinates="0,0 760,0 760,1408 0,1408 "/>                             
                        </GeometryModel3D.Geometry>
                        <GeometryModel3D.Material>                               
                            <DiffuseMaterial>
                                <DiffuseMaterial.Brush>
                                    <ImageBrush ViewportUnits="Absolute" TileMode="Tile" ImageSource="FlorVintage_FINAL.png" Viewport="0,0,768,1408" ViewboxUnits="Absolute" Stretch="None" AlignmentY="Top" RenderOptions.BitmapScalingMode="NearestNeighbor" AlignmentX="Left" />
                                </DiffuseMaterial.Brush> 
                            </DiffuseMaterial>
                        </GeometryModel3D.Material>

                    </GeometryModel3D>
                </Model3DGroup>
            </ModelVisual3D.Content>
        </ModelVisual3D>
    </Viewport3D>

</Grid>

和后面的代碼(在VB中-抱歉):

    Private Sub btnSaveSnapshot_Click(sender As Object, e As RoutedEventArgs) Handles btnSaveSnapshot.Click
    Dim bmp As New RenderTargetBitmap(1024, 550, 96, 96, PixelFormats.Pbgra32)
    bmp.Render(Me.vp3dTiles)
    Dim png As New PngBitmapEncoder()
    png.Frames.Add(BitmapFrame.Create(bmp))
    Using stm As Stream = File.Create(My.Settings.FileSavePath & "\" & "TestSnapshot.png")
        png.Save(stm)
    End Using
End Sub

我在想這可能是問題所在(網格)中的容器。

我有一個答案-定義網格行和列,並將列寬設置為與ViewPort3D相同(只有1列)。 我還必須左對齊窗口中的網格(如圖)。 不幸的是,即使將ViewPort設置為居中,它也向左對齊(請參閱代碼),這沒有任何意義,但是我可以處理一個丑陋的屏幕。

    <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="40" ></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1024" MaxWidth="1024" MinWidth="1024"></ColumnDefinition>           
    </Grid.ColumnDefinitions>
    <Button Content="Save Snapshot" Grid.Row="0" HorizontalAlignment="Left" Name="btnSaveSnapshot"  VerticalAlignment="Top" Width="100" Margin="8,8,0,0"/>
    <Viewport3D Name="vp3dTiles"  Grid.Row="1" Height="550" Width="1024" UseLayoutRounding="True"  HorizontalAlignment="Center" VerticalAlignment="Bottom" >
        <Viewport3D.Camera>
            <PerspectiveCamera Position="384,1750,174" LookDirection="0,-.65,-0.25"  UpDirection="0,0,1"  FieldOfView="65"/>
        </Viewport3D.Camera>
        <ModelVisual3D>
            <ModelVisual3D.Content>
                <Model3DGroup>
                    <AmbientLight Color="white" />
                    <GeometryModel3D>
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D Positions="0,0,0 768,0,0 768,1408,0 0,1408,0 " TriangleIndices="0 1 3 1 2 3" TextureCoordinates="0,0 760,0 760,1408 0,1408 "/>                             
                        </GeometryModel3D.Geometry>
                        <GeometryModel3D.Material>                               
                            <DiffuseMaterial>
                                <DiffuseMaterial.Brush>
                                    <ImageBrush ViewportUnits="Absolute" TileMode="Tile" ImageSource="FlorVintage_FINAL.png" Viewport="0,0,768,1408" ViewboxUnits="Absolute" Stretch="None" AlignmentY="Top" RenderOptions.BitmapScalingMode="NearestNeighbor" AlignmentX="Left" />
                                </DiffuseMaterial.Brush> 
                            </DiffuseMaterial>
                        </GeometryModel3D.Material>

                    </GeometryModel3D>
                </Model3DGroup>
            </ModelVisual3D.Content>
        </ModelVisual3D>
    </Viewport3D>
    </Grid>

渲染時,視覺尺寸需要與渲染尺寸匹​​配,並且需要進行更新。 我使用以下內容:

Dim imageWidth As Double = 2448
Dim imageHeight As Double = 2050
myviewport.Width = imageWidth / 2
myviewport.Height = imageHeight / 2
myviewport.Measure(New Size(imageWidth / 2, imageHeight / 2))
myviewport.Arrange(New Rect(0, 0, imageWidth / 2, imageHeight / 2))
'Capture Image here
myviewport.Width = Double.NaN 'restore previous value here
myviewport.Width = Double.NaN 'restore previous value here

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM