Как мне экспортировать мой wpf InkCanvas с нужным размером? - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь создать простое приложение для создания эскизов .

Но я столкнулся со странной проблемой.У меня есть Surface Pro 3, над которым я работаю, с разрешением 144, в соответствии с некоторыми настройками системы .

wrong sizes

Когда я сохраняю изображение из своего приложения, используя 96 в качестве dpi, оно создает изображение, которое немного меньше.Что странно.

Есть ли способ, которым я могу либо: а) масштабировать холст / мазки, которые я сохраняю, либо сказать RenderTargetBitmap для правильного масштабирования?Если я просто вставлю 144, я получу правильный масштаб для обводки, но мой размер холста будет увеличен.

Мой код сохранения холста выглядит следующим образом:

public void saveCanvas(object sender, RoutedEventArgs e){
    this.save_filename = this.save_filename ?? this.getSaveFilename();

    if (save_filename != null){
        var cantwo = new InkCanvas();
        cantwo.Strokes.Clear();
        cantwo.Strokes.Add(this.canvas.Strokes);
        cantwo.Background = this.canvas.Background;
        var size = new Size(this.canvas.ActualWidth, this.canvas.ActualHeight);
        cantwo.Height = size.Height;
        cantwo.Width = size.Width;
        cantwo.Measure(size);
        cantwo.Arrange(new Rect(size));
        var transform = this.canvas.LayoutTransform;
        var rtb = new RenderTargetBitmap((int)this.canvas.ActualWidth, (int)this.canvas.ActualHeight, dpiX, dpiY, PixelFormats.Default);
        rtb.Render(cantwo);
        try {
            using(var fs = File.Open(this.save_filename, FileMode.Create)){
                var encoder = new JpegBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(rtb));
                encoder.Save(fs);
            }
        }
        catch(IOException){
            MessageBox.Show("Failed to save image", "ERROR: Save Failed");
        }
        // Restore transformation if there was one.
        this.canvas.LayoutTransform = transform;
    }
}

Как я могусохранить мое изображение в том же размере / разрешении / точек на дюйм, как мой холст?(Или нарисовать на холсте с тем же разрешением / масштабом, что и при сохранении изображения)?

1 Ответ

0 голосов
/ 01 октября 2018

Вместо создания второго InkCanvas, нарисуйте прямоугольник, заполненный VisualBrush, в DrawingVisual:

var rect = new Rect(canvas.RenderSize);
var visual = new DrawingVisual();

using (var dc = visual.RenderOpen())
{
    dc.DrawRectangle(new VisualBrush(canvas), null, rect);
}

var rtb = new RenderTargetBitmap(
    (int)rect.Width, (int)rect.Height, 96, 96, PixelFormats.Default);
rtb.Render(visual);
...