2016-08-03 72 views
1

我遇到一个很奇怪的事情:一个TreeView包含的项目(图像),这种方式声明在XAML:图像大小取决于图像的色彩位深

<ControlTemplate x:Key="ImageTemplate"> 
    <Image VerticalAlignment="Top" 
      Visibility="{Binding IsImageVisible,Converter={StaticResource BoolToVisibility}}" 
      RenderOptions.BitmapScalingMode="NearestNeighbor" 
      SnapsToDevicePixels="True" 
      Stretch="None"> 
     <Image.Source> 
      <BitmapImage UriSource="c:\\imageBMP4.bmp" /> 
      <!-- <BitmapImage UriSource="c:\\imageBMP8.bmp" /> --> 
      <!-- <BitmapImage UriSource="c:\\imageBMP24.bmp" /> --> 
      <!-- <BitmapImage UriSource="c:\\imageBMP32.bmp" /> --> 
      <!-- <BitmapImage UriSource="c:\\imagePNG8.png" /> --> 
      <!-- <BitmapImage UriSource="c:\\imagePNG24.png" /> --> 
      <!-- <BitmapImage UriSource="c:\\imagePNG32.png" /> --> 
      <!-- <BitmapImage UriSource="c:\\imageJPG24.jpg" /> --> 
     </Image.Source> 
    </Image> 
</ControlTemplate> 

所有图像都是640 * 480,填充与蓝白色水平1像素线。

我体验到什么,如果我使用4个或8位位图(BMP),它们呈现精细,像素到像素树上的屏幕,尺寸640 * 480。 (然而,滚动树到端导致呈现问题,如果多个图像是在树中,参见:TreeView/ScrollView rendering bug with bitmaps?) 渲染图像(8位BMP)在树(半尺寸):

enter image description here

然而如果我改变到24或32位图像(BMP/PNG/JPG),它们被strecthed到853 * 640(1.33 *原始尺寸),这样显示strecthed /模糊。 (但是,这种情况下,滚动树到底能正常工作,没有渲染问题)树 渲染图像(24位BMP)(一半大小):

enter image description here

这是什么行为,为什么?简单地改变源图像的位深度为什么改变渲染的图像尺寸?

+0

我认为这可能是原因:'其实,我已经看到了定期与PNG图像。看起来,PNG的默认分辨率是72dpi,而WPF的默认屏幕分辨率是96dpi。 WPF试图通过将png位图缩放到像素大小的133%来考虑这一点,这在技术上是正确的,但通常不是用户想要的。您可以使用GIF或JPG代替,也可以将图像与LayoutTransform它扩展到它的大小为0.75组合,或只是坚持与设置图像控制explicitly.'的大小 – Zotyi

回答

0

好吧,我得到了这个问题:WPF默认DPI是96,而我的位图是72除8,4位,那些未指定的(这种情况下,默认的96被认为是)。 我将位图转换为96dpi,不再调整大小。 有关更多详细信息,请参阅问题下的注释。