it-swarm.com.ru

Изображение в WPF становится размытым

Я разрабатываю приложение в WPF с использованием C #. Я помещаю изображения в WrapPanel и показываю внутри сетки с еще одной границей, а также использую изображения в кнопках. Проблема в том, что мой контроль над изображениями теряет качество. Я не могу разместить свое изображение здесь, поэтому я просто описываю здесь.

Я использовал SnapsToDevicePixels="True" для изображений, но все равно это выглядит размыто.

Обновлено:

Здесь я поделился изображением ниже: enter image description here

38
Turtleneck

Я думаю, что Маркус сказал, что это единственный способ решить вашу проблему и попытаться добавить еще одно свойство RenderOptions.EdgeMode="Aliased" для каждого изображения, которое я имею в виду:

<Image Source="/LoginPanel;component/Icons/icoLogin.ico"
       RenderOptions.BitmapScalingMode="NearestNeighbor"
       RenderOptions.EdgeMode="Aliased"/>

если вы все еще не можете решить вашу проблему, то вы можете обратиться к этому http://blogs.msdn.com/b/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx , чтобы создать собственный растровый рисунок Класс и применять на всех изображениях, которые создают проблемы для вас.

Вы также можете увидеть это Вопрос переполнения стека

71
SharpUrBrain

SnapsToDevicePixels не работает для растровых изображений.

Параметры NearestNeighbor на самом деле преобразуют растровое изображение и в итоге будут отличаться от исходного растрового изображения. 

В WPF 4 для решения этой проблемы введено свойство " UseLayoutRounding " в FrameworkElement.

Установив для этого свойства значение True для корневого элемента, например Window, выровняйте дочерние элементы по краям пикселей.

<Window UseLayoutRounding="True">...</Window>
25
Recle

Это работает для меня

<Image Source="/LoginPanel;component/Icons/icoLogin.ico"
       RenderOptions.BitmapScalingMode="NearestNeighbor"</Image>

Установите RenderOptions.BitmapScalingMode = "NearestNeighbor" для каждого изображения. В качестве альтернативы см. Этот вопрос здесь, на StackOverflow.

Правка:
Вот мой пример кода

<Window x:Class="MainWindow"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="661">
    <WrapPanel>
        <Button VerticalAlignment="Center">
            <Image Source="/WpfApplication1;component/icoChip32x32.ico"
               RenderOptions.BitmapScalingMode="NearestNeighbor" Stretch="None"></Image>
        </Button>
        <Button VerticalAlignment="Center">
            <Image Source="/WpfApplication1;component/icoChip32x32.ico"
                   RenderOptions.BitmapScalingMode="NearestNeighbor" Stretch="None"></Image>
        </Button>

        <Button VerticalAlignment="Center">
            <Image Source="/WpfApplication1;component/Presentation-Edit.png"
               RenderOptions.BitmapScalingMode="NearestNeighbor" Stretch="None"></Image>
        </Button>
        <Button VerticalAlignment="Center">
            <Image Source="/WpfApplication1;component/Presentation-Edit.png"
                   RenderOptions.BitmapScalingMode="NearestNeighbor" Stretch="None"></Image>
        </Button>
    </WrapPanel>
</Window>

И это мой результат:
...and this is my result

15
Markus

Используйте свойство UseLayoutRounding = "True" для родительского элемента, если изображение используется в качестве содержимого. В вашем случае это кнопка.

7
suheeb

Я столкнулся с проблемой размытости фоновых изображений, вызванной масштабированием, и решение оказалось намного проще, чем вы думаете. Хотя сначала я задавался вопросом, масштабируется ли он до размера текстуры степени двойки, масштабирование фактически соответствует соотношению System DPI (96): Image DPI (72, которое по умолчанию используется во многих редакторах). Если вы отрегулируете изображение до 96 DPI, оно должно отображаться с точностью до пикселя при настройках Windows по умолчанию.

Правка: пробовал изображение с высокой контрастностью деталей, и оно слегка смягчается. 

3
Bernard

У меня была та же проблема, но в моем случае я скачал иконки и обнаружил, что у них тоже был неправильный DPI ... 110,56 и 116, хх и 95,99 и т.д. ...

Когда я изменил DPI на 96 для всех, все было хорошо!

1
Jessica Bendler

WPF не использует конкретные значения пикселей для размеров и позиционирования, поэтому он может хорошо масштабироваться с DPI.

Это может привести к проблеме, когда он пытается использовать позицию, которая не соответствует дискретному экранному пикселю; некоторые пиксели изображения отображаются поверх нескольких пикселей на экране, которые мы видим как размытые.

UseLayoutRendering = true с SnapToDevicePixels = false должно решить эту проблему. Вам также необходимо установить его на уровне главного окна, чтобы вычисления каскадно доходили до уровня изображения.

Вы можете попробовать это, создав простое приложение WPF с одним окном и вашими изображениями. Установка поля изображения на что-то глупое (10.452, 0.736, 0, 0) приведет к размытию. Это исчезает с UseLayoutRendering = true на изображении.

Если затем вы снова установите поле в конструкторе вашего окна после InitializeComponent (), оно будет размытым независимо от того, установлено ли на изображении значение UseLayoutRendering = true, поскольку вычисления для выравнивания с пикселями на экране были выполнены до того, как вы затем переместили изображение в место, которое не совпадает с этим.

Я не совсем уверен, в чем разница между UseLayoutRendering и SnapToDevicePixels - я думаю, что это просто время, когда производятся вычисления. UseLayoutRendering представляется предпочтительным для изображений.

Растяжение/сжатие изображения от исходного размера также может привести к проблемам с размытостью.

0
RickySpanish