SnapsToDevicePixels не работает с изображениями? - PullRequest
4 голосов
/ 03 августа 2011

Я столкнулся с проблемой растровых изображений в WPF.Когда контейнер изображения начинается с позиции, которая не является целым числом, изображение, похоже, не соответствует значению SnapsToDevicePixels.

Пример кода:

<Window x:Class="BlurryImage.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="110" Width="200">
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
        <Button SnapsToDevicePixels="True">
            <Image SnapsToDevicePixels="True" Source="i16.png" Stretch="None"/>
        </Button>
        <Button SnapsToDevicePixels="True" Margin="10.333333,0,0,0">
            <Image SnapsToDevicePixels="True" Source="i16.png" Stretch="None"/>
        </Button>
    </StackPanel>
</Window>

(Обратите внимание на значениелевого поля: 10,333333.)

Здесь изображение i16.png представляет собой простое растровое изображение 16x16 с разрешением 96 DPI с тонкими вертикальными линиями: image here.(У меня разрешение системы 96 DPI, Windows XP, .NET 4)

Когда я запускаю программу, первое изображение получается резким, а второе - размытым: blurry image screenshot

ДругойИсточники, в том числе некоторые из них, посвященные stackoverflow, предлагают различные обходные пути.(Например, эти сообщения: [1] , [2] и [3] .) Я попробовал обходные пути, и они, кажется, работают.Использование UseLayoutRounding="true" в главном окне делает оба изображения четкими.Использование RenderOptions.BitmapScalingMode="NearestNeighbor" на изображении также делает его резким.

Вопрос в том, почему SnapsToDevicePixels="True" не работает без обходных путей?Это ошибка в WPF или я использую ее неправильно?

1 Ответ

4 голосов
/ 03 августа 2011

Из этой записи блога :

SnapsToDevicePixels

WPF ожидала, что в некоторых случаях люди захотят присоединитьсяпиксельная сетка вместо использования субпиксельной точности.Вы можете установить свойство SnapsToDevicePixels для любого UIElement.Это заставит нас попытаться выполнить рендеринг в пиксельную сетку, но есть немало случаев, которые не работают, включая изображения.Мы постараемся улучшить это в будущем.

Так что это просто известное ограничение того, что может делать SnapsToDevicePixels.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...