Рендеринг Canvas с RenderTargetBitmap дает размытые изображения - PullRequest
1 голос
/ 04 мая 2019

Я делаю программу для рисования, используя холст, и отрисовываю ее на себя, но каждый раз, когда я рендерирую с помощью RenderTargetBitmap, мое изображение становится размытым, и это происходит чаще с большим холстом.

В прошлом была другая проблема, когдакаждый раз, когда я рендерил, мое изображение сдвигалось вправо-вниз, но это было исправлено благодаря помощи в stackoverflow.

Вот мой прошлый вопрос: RenderTargetBitmap Slide Image

Вотмой код:

XAML

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="25"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="150"/>
        </Grid.ColumnDefinitions>


        <ScrollViewer Grid.Row="2" Grid.Column="1"
               HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
            <Canvas x:Name="Pad" Focusable="True" FocusManager.IsFocusScope="True" Width="700" Height="500"
                MouseDown="Pad_MouseDown" MouseMove="Pad_MouseMove" MouseUp="Pad_MouseUp"
                SnapsToDevicePixels="True" Background="White" ClipToBounds="True">
            </Canvas>
        </ScrollViewer>
</Grid>

C #

    public partial class MainWindow : Window
    private bool IsDrawing = false;
    private Polyline polyline;

    public MainWindow()
        {
            InitializeComponent();
        }
    private void Pad_MouseDown(object sender, MouseButtonEventArgs e)
         if (e.ChangedButton == MouseButton.Left)
                {
                    IsDrawing = true;
                    Point p = e.GetPosition((Canvas)sender);
                    polyline = new Polyline();
                    polyline.Stroke = Brushes.Black;;
                    polyline.StrokeThickness = 2;
                    polyline.StrokeStartLineCap = PenLineCap.Round;
                    polyline.StrokeEndLineCap = PenLineCap.Round;
                    polyline.StrokeLineJoin = PenLineJoin.Round;
                    polyline.Points.Add(p);
                    polyline.Points.Add(p);
                    Pad.Children.Add(polyline);

                }
    private void Pad_MouseMove(object sender, MouseEventArgs e)
        {
            Point p = e.GetPosition((Canvas)sender);
            if (IsDrawing)
            {
                polyline.Points.Add(p);
            }
        }
    private void Pad_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (e.ChangedButton == MouseButton.Left && IsDrawing)
            {
                    IsDrawing = false;
                    RenderCanvas();
            }
        }

   // Render the Canvas and set the rendered image as background of canvas

   public static void RenderCanvas()
        {
        ImageBrush brush = new ImageBrush();
        RenderTargetBitmap rtb;
        Rect bounds;
        DrawingVisual dv;


            bounds = VisualTreeHelper.GetDescendantBounds(Pad);
            rtb = new RenderTargetBitmap((int)(bounds.Width), (int)(bounds.Height), 96, 96, PixelFormats.Pbgra32);
            dv = new DrawingVisual();
            using (DrawingContext ctx = dv.RenderOpen())
            {
                VisualBrush vb = new VisualBrush();
                vb.Stretch = Stretch.None;
                vb.AlignmentX = AlignmentX.Left;
                vb.AlignmentY = AlignmentY.Top;
                vb.Visual = Pad;
                ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
            }
            rtb.Render(dv);


            Pad.Children.Clear();
            brush.Stretch = Stretch.None;
            brush.AlignmentX = AlignmentX.Left;
            brush.AlignmentY = AlignmentY.Top;
            brush.ImageSource = rtb;
            Pad.Background = brush;
        }

Некоторые снимки экрана холста с разным разрешением 700, 2000, 3000, 5000

Canvas with width and height of 700 Canvas with width and height of 2000 Canvas with width and height of 3000 Canvas with width and height of 5000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...