2016-08-03 71 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,不再調整大小。 有關更多詳細信息,請參閱問題下的註釋。