У меня есть кнопка 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;
}
Не используйте 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 является форматом кодирования, т.е. для файлов изображений. Но почему у вас вообще есть Bitmap
вместо того, чтобы напрямую создавать BitmapImage из исходного файла?
Гораздо лучшее решение — вообще не делать этого, Image
может загружаться прямо из потока ресурсов, вам не нужно делать это странное кодирование и декодирование.
Я развертываю однофайловое решение. Я не мог найти способ загрузить изображение непосредственно из resources.resx или как в противном случае предоставить изображение в однофайловом приложении. Если вы знаете лучшее решение, я был бы рад получить ответ.
Вы не загружаете изображение из resources.resx в WPF. Смотрите здесь: stackoverflow.com/a/22957974/1136211
@Blindy Image не может сделать это напрямую. Преобразование из строки, Uri, Stream или массива байтов выполняется экземпляром ImageSourceConverter, TypeConverter, зарегистрированным для типа ImageSource.
Хорошо сработал этот учебник. Спасибо за объяснения.
большое спасибо. Я думал, что .bmp — это растровое изображение, поддерживающее альфа-канал в .Net.