2016-07-21 5 views
1

Используя метод this, я хочу отобразить холст в растровое изображение.Почему моя Shapes.Line в два раза больше, чем я хочу, чтобы она была на холсте?

Когда я добавляю Shape в Canvas, он отображается в два раза выше указанного размера.

В приведенном ниже примере, я рисование линии из (0, 0) до (50; 50) на полотне размером 200 на 200.

public bool exportToBmp(string path, int dpi = 96) 
    { 
     if (path == null) 
      return false; 

     var canvas = new System.Windows.Controls.Canvas(); 

     // This diagonal Line should span a quarter of the rendered Image 
     var myLine = new System.Windows.Shapes.Line(); 
     myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue; 
     myLine.X1 = 0; 
     myLine.X2 = 50; 
     myLine.Y1 = 0; 
     myLine.Y2 = 50; 
     myLine.StrokeThickness = 2; 
     canvas.Children.Add(myLine); 

     canvas.Height = 200; 
     canvas.Width = 200; 
     Size size = new Size(canvas.Width, canvas.Height); 

     canvas.Measure(size); 
     canvas.Arrange(new Rect(size)); 

     var width = (int)canvas.ActualWidth; 
     var height = (int)canvas.ActualHeight; 

     RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, dpi, dpi, PixelFormats.Pbgra32); 
     bmp.Render(canvas); 

     PngBitmapEncoder image = new PngBitmapEncoder(); 
     image.Frames.Add(BitmapFrame.Create(bmp)); 
     using (Stream fs = File.Create(path)) 
     { 
      image.Save(fs); 
     } 

     return false; 
    } 

Визуализированное изображение, которое я получаю 200 путем 200 точек большой, но диагональ идет вплоть до (100; 100)

output Bitmap

Что я делаю неправильно?

ответ

2

Когда я запускаю свой код, я вижу следующее изображение (граница добавлена ​​для ясности):

enter image description here

Вы проходящие в DPI, кроме 96?

Какие параметры DPI используются на вашем компьютере?

+0

Да, я использую dpi = 200. –

+0

Это привело меня на правильный путь. Я не знал, что dpi на самом деле изменяет содержимое изображения, я думал, что это просто указано, какой размер будет отображаться на экране при 100%. Zoom –

+0

Попробуйте использовать DPI 96, а не 200. –