如何在 WPF 中独立显示位图 Windows 缩放级别(DPI?)

How to display a Bitmap Windows zoom level (DPI?) independent in WPF

我是WPF新手,面临以下问题。 我正在显示位图,xaml:

<ControlTemplate x:Key="MyEditorImageTemplate">
    <Image  VerticalAlignment="Top" Margin="3,1,0,0"
            RenderOptions.BitmapScalingMode="NearestNeighbor"
            Stretch="None">
        <Image.Source>
            <MultiBinding Converter="{StaticResource MyEditorConverter}">
                <Binding Path="....." />

Bitmap来自BitmapSource,提供方式如下:

Bitmap^ bitmap = System::Drawing::Image::FromHbitmap((IntPtr)aBmp);
IntPtr hbmp = bitmap->GetHbitmap();
BitmapSource bs = 
     Imaging::CreateBitmapSourceFromHBitmap(hbmp, 
                                            System::IntPtr::Zero,
                                            Int32Rect(0,0,nWidth,nHeight),
                                            BitmapSizeOptions::FromEmptyOptions());

现在一切正常,直到我将 windows 缩放级别设置为 100%。 如果我在 Windows 中将其更改为 125%:

位图也在 GUI 上缩放。

我知道这在某种程度上是预期的,但是有什么方法可以让我仍然显示 1-1 像素大小,忽略 windows 缩放设置?

好的,我找到了解决方案。 您只需要一个自己的图像 class,派生自图像,并简单地覆盖 OnRender,您可以在其中适当调整大小(如有必要)。

protected override void OnRender(DrawingContext dc)
{
    //base.OnRender(dc);    --> we do out own painting
    Rect targetRect = new Rect(RenderSize);
    PresentationSource ps = PresentationSource.FromVisual(this);
    if (ps != null && Source != null)
    {
        Matrix fromDevice = ps.CompositionTarget.TransformFromDevice;
        Vector currentVisibleSize = new Vector(Source.Width, Source.Height);
        Vector originalRestoredSize = fromDevice.Transform(currentVisibleSize);
        targetRect = new Rect(new Size(originalRestoredSize.X, originalRestoredSize.Y));
    }
    dc.DrawImage(Source, targetRect);
}

有了这个,无论 Windows 缩放设置如何,您将始终拥有 100% 的原始大小。 我从这个网站得到了这个想法:http://blogs.msdn.com/b/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx