Я делаю программу для рисования, используя холст, и отрисовываю ее на себя, но каждый раз, когда я рендерирую с помощью 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