Mit der Methode this möchte ich eine Leinwand in eine Bitmap rendern.Warum ist meine Shapes.Line doppelt so groß, wie ich es auf Canvas haben möchte?
Wenn ich eine Shape
zu Canvas
hinzufüge, wird es doppelt so groß wie angegeben. (0 0) bis (50; 50) auf einer Leinwand von Größe 200 bis 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;
}
Das I gerenderten Bild erhalte 200 von
Im Beispiel unten, ich bin eine Linie von der Zeichnung 200 px groß, aber die Diagonale geht den ganzen Weg zu (100; 100)
Was mache ich falsch?
Ja, ich verwende dpi = 200. –
Es brachte mich auf die richtige Spur. Ich wusste nicht, dpi ändert tatsächlich den Inhalt des Bildes, ich dachte es nur angegeben, welche Größe das Bild auf dem Bildschirm bei 100% gerendert wird Zoom –
Versuchen Sie mit DPI von 96, nicht 200. –