Визуализация холста WPF как точечного рисунка определенного размера
У меня есть холст WPF, из которого я хочу сделать растровое изображение.
В частности, я хочу отобразить его фактический размер на растровом изображении 300 точек на дюйм. "Фактический размер" объектов на холсте в реальной жизни составляет 10 независимых от устройства пикселей = 1". Теоретически независимые от устройства WPF пиксели имеют разрешение 96 точек на дюйм.
Я потратил несколько дней, пытаясь заставить это работать, и я в замешательстве.
Я понимаю, что общая процедура примерно:
var masterBitmap = new RenderTargetBitmap((int)(canvas.ActualWidth * ?SomeFactor?),
(int)(canvas.ActualHeight * ?SomeFactor?),
BitmapDpi, BitmapDpi, PixelFormats.Default);
masterBitmap.Render(canvas);
и что мне нужно установить LayoutTransform холста в ScaleTransform из? SomeOtherFactor? а затем сделать меру и организовать холст для? SomeDesiredSize?
Я застрял на том, что использовать для значений "SomeFactor", "SomeOtherFactor"? и? SomeDesiredSize? чтобы сделать эту работу. В документации MSDN нет указаний о том, какие факторы использовать.
1 ответ
Я использую этот код для отображения изображений с точностью до 1:1 пикселя.
double dpiXFactor, dpiYFactor;
Matrix m = PresentationSource.FromVisual(Application.Current.MainWindow).CompositionTarget.TransformToDevice;
if (m.M11 > 0 && m.M22 > 0)
{
dpiXFactor = m.M11;
dpiYFactor = m.M22;
}
else
{
// Sometimes this can return a matrix with 0s.
// Fall back to assuming normal DPI in this case.
dpiXFactor = 1;
dpiYFactor = 1;
}
double width = widthPixels / dpiXFactor;
double height = heightPixels / dpiYFactor;
Не забудьте также включить UseLayoutRounding для элемента управления.