Ресурс png теряет качество после преобразования растрового изображения в ImageSource - PullRequest
3 голосов
/ 21 июня 2019

У меня есть PNG с прозрачностью, которая теряет много качества при конвертации в ImageSource.Что я делаю, чтобы преобразовать это следующее:

public static ImageSource ToImageSource()
    {   Bitmap bitmap = Properties.Resources.Image;
        IntPtr hBitmap = bitmap.GetHbitmap();

        ImageSource wpfBitmap = Imaging.CreateBitmapSourceFromHBitmap(
            hBitmap,
            IntPtr.Zero,
            Int32Rect.Empty,
            BitmapSizeOptions.FromEmptyOptions());
        RenderOptions.SetBitmapScalingMode(wpfBitmap, BitmapScalingMode.HighQuality);

        return wpfBitmap;
    }

Но качество действительно плохое.когда я обращаюсь непосредственно к файлу на моем компьютере, качество корректное:

<DataGridTemplateColumn Width="14" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="C:\Users\MyUser\Desktop\Image.png" Width="14" Height="14"></Image>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

Есть ли другой способ преобразования ресурса без потери качества и прозрачности?

Ответы [ 3 ]

0 голосов
/ 21 июня 2019

К сожалению, я не могу проверить ваш код, но я думаю, что вы должны установить режим на NearestNeighbor

Попробуйте это

public static ImageSource ToImageSource()
{   
   Bitmap bitmap = Properties.Resources.Image;
   IntPtr hBitmap = bitmap.GetHbitmap();

   ImageSource wpfBitmap = Imaging.CreateBitmapSourceFromHBitmap(
       hBitmap,
       IntPtr.Zero,
       Int32Rect.Empty,
       BitmapSizeOptions.FromEmptyOptions());
   RenderOptions.SetBitmapScalingMode(wpfBitmap, BitmapScalingMode.NearestNeighbor);

   return wpfBitmap;
}

0 голосов
/ 21 июня 2019

Или ... попробуйте это:)

public static ImageSource ToImageSource()
{
     Bitmap bitmap = Properties.Resources.Image;
     IntPtr hBitmap = bitmap.GetHbitmap();

     ImageSource wpfBitmap = Imaging.CreateBitmapSourceFromHBitmap(
                        hBitmap,
                        IntPtr.Zero,
                        new Int32Rect(0, 0, bitmap.Width, bitmap.Height),
                        BitmapSizeOptions.FromEmptyOptions());

      DeleteObject(hBitmap);
      return wpfBitmap;
}

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

Вызов DeleteObject освободит дескриптор GDI.

0 голосов
/ 21 июня 2019

Попробуйте:

BitmapImage image = new BitmapImage(new Uri("your image path here", UriKind.Relative));

Редактировать: при условии, что у вас есть путь к изображению.

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