如何在 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
我是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