Language/C# WPF

[WPF] BitmapImage로 이미지 파일(image file load) 읽기

멱군 2024. 2. 7. 00:35

Windows Presentation Foundation(WPF)는 .NET에서 사용되는 그래픽 시스템으로, 다양한 UI 요소를 쉽게 만들고 관리할 수 있게 해줍니다. WPF에서 이미지를 표시하는 것은 매우 일반적인 작업 중 하나입니다. 이번 포스트에서는 WPF 애플리케이션에서 BitmapImage를 사용하여 이미지 파일을 로드하고 Image 컨트롤에 표시하는 방법을 소개합니다. 이 방법은 UI에 이미지를 통합하고자 할 때 유용하게 사용될 수 있습니다.

 

 

1. WPF 프로젝트 생성 및 Image 컨트롤 추가

먼저 Visual Studio에서 새로운 WPF 애플리케이션 프로젝트를 생성합니다. 그리고 MainWindow.xaml 파일에 Image 컨트롤을 추가합니다. 이 컨트롤은 로드된 이미지를 표시하는 데 사용됩니다.

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Image Loader" Height="450" Width="800">
    <Grid>
        <Image Name="LoadedImage" Stretch="Uniform" />
    </Grid>
</Window>

 

2. BitmapImage를 사용하여 이미지 로드

MainWindow.xaml.cs 파일에 이미지를 로드하고 Image 컨트롤의 Source 속성에 할당하는 코드를 추가합니다. 이를 위해 BitmapImage 클래스를 사용하며, 이미지 파일의 경로는 해당 시스템에 맞게 지정해야 합니다.

using System;
using System.Windows;
using System.Windows.Media.Imaging;
using System.IO; // FileInfo를 사용하기 위해 추가

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            string imagePath = @"C:\path\to\your\image.jpg"; // 이미지 파일 경로 지정
            LoadedImage.Source = Imgload(imagePath);
        }

        private BitmapImage Imgload(string strpath)
        {
            try
            {
                FileInfo fio = new FileInfo(strpath);
                if (fio.Exists)
                {
                    BitmapImage img = new BitmapImage();

                    img.BeginInit();
                    img.CacheOption = BitmapCacheOption.OnLoad;
                    img.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
                    img.UriSource = new Uri(strpath, UriKind.RelativeOrAbsolute);
                    img.EndInit();

                    if (img.CanFreeze) img.Freeze();

                    return img;
                }
                else
                    return null;
            }
            catch
            {
                return null;
            }
        }
    }
}

 

Imgload("이미지파일전체경로.확장자");

이 함수를 이용해서 이미지를 불러올 수 있습니다.

함수안에 BitmapImage를 생성하는 순서를 지켜줘야 합니다.

  • img.BeginInit();
    • 이미지 객체의 초기화를 시작합니다.
    • BeginInit 메서드는 BitmapImage의 여러 속성을 설정하기 전에 호출되어야 합니다.
  • img.CacheOption = BitmapCacheOption.OnLoad;
    • 이미지의 캐시 옵션을 설정합니다.
    • BitmapCacheOption.OnLoad는 이미지를 메모리에 캐시하며, 이미지가 로드되는 즉시 캐시됩니다.
    • 이는 이미지 파일이 로드된 후에는 원본 파일에 대한 의존성이 없어지도록 합니다.
  • img.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
    • 이미지 생성 옵션을 설정합니다.
    • BitmapCreateOptions.IgnoreImageCache는 이미지를 로드할 때 시스템의 이미지 캐시를 무시하고 항상 파일로부터 이미지를 로드하도록 지시합니다.
    • 이는 이미 동일한 URI로 로드된 이미지가 있더라도 새로운 이미지를 로드하고자 할 때 유용합니다.
  • img.UriSource = new Uri(strpath, UriKind.RelativeOrAbsolute);
    • 로드할 이미지의 파일 경로를 지정합니다.
    • Uri 객체는 파일의 경로(상대 또는 절대 경로)를 나타내며, strpath 변수에는 이미지 파일의 경로가 포함됩니다.
  • img.EndInit();
    • 이미지 객체의 초기화를 완료합니다.
    • 모든 속성 설정 후 EndInit 메서드를 호출하여 초기화 과정을 마무리합니다.
  • if (img.CanFreeze) img.Freeze();
    • Freeze 메서드를 호출하여 이미지 객체를 변경 불가능하게 만듭니다.
    • CanFreeze 속성으로 객체가 Freeze 가능한지 확인한 후, Freeze를 호출합니다.
    • 이는 스레드 안전성을 보장하고, 성능을 최적화하기 위해 사용됩니다.
    • Freeze된 객체는 다른 스레드에서 안전하게 사용할 수 있으며, 변경할 수 없게 됩니다.

 

저는 프로그램 경로에 멱군로고파일을 불러오도록 프로그램을 만들었습니다.

로고가 잘 불러와지네요.

 

3. 프로젝트 소스코드 다운로드

본 포스팅에서 사용한 프로젝트의 소스는 아래의 링크를 다운로드 받으시면 됩니다.

WPF_BitmapImage_load.zip
0.19MB

 

결론

WPF에서 BitmapImage를 사용하여 이미지 파일을 로드하고 표시하는 방법은 간단하면서도 효과적입니다. 이 방법을 통해 사용자 인터페이스에 다양한 이미지를 쉽게 통합할 수 있으며, 사용자 경험을 풍부하게 만들 수 있습니다. 실제 이미지 경로를 올바르게 설정하는 것이 중요하며, 이 예제를 기반으로 다양한 이미지 처리 작업을 시도해 볼 수 있습니다.

 

함께보면 좋은글

 

[C#] OpenFileDialog 활용하여 파일 선택하기

C#을 사용하다보면 파일을 선택하거나 불러오는 작업이 필요할 때가 많습니다. 이럴 때 사용하는 기능 중 하나가 OpenFileDialog입니다. 이번 글에서는 OpenFileDialog의 기본 사용법과 주요 기능들에 대

devit.koreacreatorfesta.com

 

WPF 프로그램 시작 경로 알아내는 방법 3가지

WPF(Windows Presentation Foundation) 애플리케이션에서 프로그램의 시작 경로를 확인하는 것은 여러 상황에서 유용할 수 있습니다. 예를 들어, 응용 프로그램과 함께 배포되는 파일을 참조하거나 로컬

devit.koreacreatorfesta.com