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

时间:2015-06-30 08:23:03

标签: wpf bitmap zoom dpi

我是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());

现在这个工作正常,直到我的窗口缩放级别为100%。 如果我在Windows中将其更改为125%:

位图也在GUI上放大。

据我所知,这是预期的,但有没有办法让我仍然显示1-1像素大小,忽略了Windows缩放设置?

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案。 您只需要一个自己的Image类,派生自Image,并简单地覆盖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