Подтвердить что ты не робот

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

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

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

Обновлено:

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

4b9b3361

Ответ 1

Я думаю, что Маркус сказал, это единственный способ решить вашу проблему и попробовать, добавив в нее еще одно свойство 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, чтобы создать собственный класс Bitmap и применить на всех изображениях которые создают для вас неприятности.

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

<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

Ответ 4

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

Ответ 5

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

РЕДАКТИРОВАТЬ: Пробовал изображение с высоким контрастом детализации и слегка смягчился.

Ответ 6

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

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

Ответ 7

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

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

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

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

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

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

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