Визуализация холста 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 для элемента управления.

Другие вопросы по тегам