Кнопка с прозрачным изображением png в .Net WPF

У меня есть кнопка WPF, которая должна отображаться с изображением png с прозрачными областями.

Это мой код xaml, который работает для отображения изображения:

<Button HorizontalAlignment = "Left" VerticalAlignment = "Top" Panel.ZIndex = "2" Background = "Transparent" BorderBrush = "Transparent">
    <Image Width = "1cm" Height = "1cm" x:Name = "LogoImageChangeButton_Image"/>
</Button>

Это образ. Как видите, у него есть прозрачные области:

К сожалению, wpf по какой-то неизвестной причине повторяет или принимает пиксели в прозрачных областях. К сожалению, эффект выглядит довольно глючно, поэтому я не могу описать его лучше:

Я пробовал с разными режимами растяжения, у всех, похоже, была эта проблема. Любая помощь приветствуется.

Вот как я установил изображение:

LogoImageChangeButton_Image.Source = BitmapHelper_Net.BitmapConverter.Convert(Properties.Resources.ChangeImageIcon);

и вот как я конвертирую растровое изображение в источник изображения:

public static BitmapImage Convert(Bitmap src)
{
    MemoryStream ms = new MemoryStream();
    ((System.Drawing.Bitmap)src).Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
    BitmapImage image = new BitmapImage();
    image.BeginInit();
    ms.Seek(0, SeekOrigin.Begin);
    image.StreamSource = ms;
    image.EndInit();
    return image;
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не используйте BMP в качестве формата преобразования. Он не поддерживает прозрачность.

Используйте PNG и установите BitmapCacheOption.OnLoad, чтобы иметь возможность удалять поток после EndInit.

public static BitmapImage Convert(Bitmap src)
{
    var image = new BitmapImage();

    using (var ms = new MemoryStream())
    {
        src.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        ms.Seek(0, SeekOrigin.Begin);

        image.BeginInit();
        image.CacheOption = BitmapCacheOption.OnLoad;
        image.StreamSource = ms;
        image.EndInit();
    }

    return image;
}

большое спасибо. Я думал, что .bmp — это растровое изображение, поддерживающее альфа-канал в .Net.

julian bechtold 02.02.2023 20:57

Как и другие форматы, BMP является форматом кодирования, т.е. для файлов изображений. Но почему у вас вообще есть Bitmap вместо того, чтобы напрямую создавать BitmapImage из исходного файла?

Clemens 02.02.2023 20:58

Гораздо лучшее решение — вообще не делать этого, Image может загружаться прямо из потока ресурсов, вам не нужно делать это странное кодирование и декодирование.

Blindy 02.02.2023 21:04

Я развертываю однофайловое решение. Я не мог найти способ загрузить изображение непосредственно из resources.resx или как в противном случае предоставить изображение в однофайловом приложении. Если вы знаете лучшее решение, я был бы рад получить ответ.

julian bechtold 02.02.2023 21:08

Вы не загружаете изображение из resources.resx в WPF. Смотрите здесь: stackoverflow.com/a/22957974/1136211

Clemens 02.02.2023 21:08

@Blindy Image не может сделать это напрямую. Преобразование из строки, Uri, Stream или массива байтов выполняется экземпляром ImageSourceConverter, TypeConverter, зарегистрированным для типа ImageSource.

Clemens 02.02.2023 21:12

Хорошо сработал этот учебник. Спасибо за объяснения.

julian bechtold 02.02.2023 21:30

Другие вопросы по теме