Как загрузить изображение из ресурсов WPF C#

Всем привет! Меня всегда удивляла логика работы WinForm что не скажешь о WPF. Казалось бы что может быть проще простого использовать ресурсы хранящиеся в проекте. Но не все так просто конечно, хочется использовать те подходы которые реализованы в WinForm но они не работают. Гугление и решение на всех сайтах однотипные, что мне не нравилось и я хотел показать как альтернативный способ как можно использовать изображения из папки Resources. Основной для меня было динамическое подгрузка картинок из папки Resources.

Самый распространенный способ решения:

 System.Windows.Media.Imaging.BitmapImage bit =
    new BitmapImage(new Uri("/Resources/1.jpg", UriKind.Relative));
 img.Source = bit;

Мы имеем папку Resources в котором есть изображение 1.jpg в качестве второго аргумента указываем относительный путь. Изображения я добавлял через свойства проекта>>Ресурсы.

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

<Image x:Name="img" HorizontalAlignment="Left"  VerticalAlignment="Top" Source="Resources/1.jpg" />

А вот теперь показываю тот способ который использую я:

  ResourceManager resMan =WpfApp.Properties.Resources.ResourceManager;

            Bitmap bm = (Bitmap)resMan.GetObject("_1");
            BitmapSource bit = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
            bm.GetHbitmap(), IntPtr.Zero,Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());

            img.Source = bit;

 

WpfApp это namespace дальше указывается полный путь до изображения.

_1 это имя которое было задано автоматически при добавлении файла 1.jpg.

А теперь показываю как динамически изменять изображения из папки Resources

  ResourceManager resMan = WpfApp.Properties.Resources.ResourceManager;
            ResourceSet resourceSet = resMan.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
            IDictionaryEnumerator id = resourceSet.GetEnumerator();
            while (id.MoveNext())
            {

                Bitmap br = (Bitmap)id.Value;
                BitmapSource bit = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                br.GetHbitmap(),IntPtr.Zero,Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
                img.Source = bit;
                await Task.Delay(2000);
            }

 

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

Обновлено: 30.04.2021 — 19:39

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.