为什么这个位图图像在加载后会改变它的大小?

快速提问:

我有这个1000 x 1000位图图像:

在此处输入图像描述

我用这个例程来加载它:

private BitmapSource initialBitmap = new BitmapImage(new Uri("C:\\Users\\...\\Desktop\\Original.bmp")); 

为什么在我加载之后,在我跨过上面的线后,我看到它是800 x 800

在此处输入图像描述

PS我希望它是1000 x 1000并且不使用任何Resize函数。 它工作,突然它是800 * 800!

BitmapSource.WidthBitmapSource.Height返回的值不是像素,而是WPF的设备无关单位,总是96 dpi。 例如:

以与设备无关的单位获取位图的宽度(每单位1/96英寸)。

如果您想知道实际的像素宽度和高度,则需要使用PixelWidthPixelHeight属性。

你的问题不是很具体,但如果你真正关心的是将位图显示的大小与创作的大小相同,那么最简单的解决方案就是确保你以96 dpi的速度创作它。 无论您使用什么程序来创作位图,都可以在其中设置位图分辨率。 通常,这可以在改变或不改变图像的像素尺寸的情况下设置(即,将图像缩放得更大或更小); 您希望在不缩放图像的情况下执行此操作,以便像素尺寸保持不变,但dpi会更改以匹配WPF正在使用的内容。

请注意,这仍然不能保证位图显示在特定的像素大小。 显示分辨率可以且通常不同于96 dpi,在这种情况下,WPF将缩放图像以确保图像的物理尺寸(即以英寸,毫米等为单位的尺寸)根据位图中的信息是正确的。 例如,96 dpi时960像素宽意味着10“宽。在120 dpi显示器上,这意味着显示足够大的位图,使其宽度使用1200个显示像素。

如果您希望或需要位图以完全相同数量的显示像素显示,而不管显示分辨率如何,那么您必须设置一个转换,您可以在其中显示图像以反转WPF否则将执行的缩放效果。 当然,这需要知道显示分辨率。

以下是一些您可能会觉得有用的其他相关Stack Overflow问题: RenderTargetBitmap呈现错误大小的图像
WPF用于液晶屏全高清
WPF中的屏幕分辨率问题?

这是设计的。 请注意BitmapSource.Width/Height的MSDN文档 :

以与设备无关的单位获取位图的宽度(每单位1/96英寸)。 (重写ImageSource.Width。)

相反,您应该使用PixelWidth / PixelHeight属性:

获取位图的宽度(以像素为单位)。

一个相当令人困惑的选择或条款,imo,但你去…