본문 바로가기
프로그래밍

👨‍💻 [MFC] MFC 에서 이미지(Image)를 처리하려면 어떻게 해야 하나요?

by 밝음의기둥 2024. 10. 21.
반응형

👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

MFC 에서 이미지(Image)를 처리하려면 어떻게 해야 하는지 알아보았습니다..


질문 >

MFC 에서 이미지(Image)를 처리하려면 어떻게 해야 하나요?

답변 >

Windows MFC (Microsoft Foundation Classes)에서는 이미지를 표시하거나 처리하는 여러 방법을 제공합니다. MFC를 사용해 애플리케이션에 이미지를 표시하려면 CImage, GDI+ 또는 CDC와 같은 클래스를 사용할 수 있습니다. 아래는 MFC에서 이미지를 로드하고 표시하는 기본적인 방법을 설명합니다.

1. CImage 클래스를 사용한 이미지 로드 및 표시

CImage 클래스는 MFC에서 이미지 파일을 로드하고 쉽게 렌더링할 수 있도록 지원하는 유용한 도구입니다.

코드 예제: CImage를 사용해 이미지 표시

#include <afxwin.h>   // MFC 기본 헤더
#include <atlimage.h> // CImage 클래스 사용

class CMyWindow : public CFrameWnd
{
public:
    CImage m_image;

    CMyWindow()
    {
        Create(NULL, _T("MFC Image Example"));

        // 이미지 로드 (경로 수정 필요)
        HRESULT hResult = m_image.Load(_T("example.jpg"));
        if (FAILED(hResult))
        {
            MessageBox(_T("이미지 로드 실패!"));
        }
    }

    afx_msg void OnPaint()
    {
        CPaintDC dc(this); // 장치 컨텍스트 생성
        if (!m_image.IsNull())
        {
            // 이미지의 크기를 가져옴
            int width = m_image.GetWidth();
            int height = m_image.GetHeight();

            // 이미지를 윈도우 클라이언트 영역에 그리기
            m_image.Draw(dc, 0, 0, width, height);
        }
    }

    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CMyWindow, CFrameWnd)
    ON_WM_PAINT()
END_MESSAGE_MAP()

class CMyApp : public CWinApp
{
public:
    BOOL InitInstance()
    {
        CMyWindow* pWindow = new CMyWindow();
        m_pMainWnd = pWindow;
        pWindow->ShowWindow(SW_SHOW);
        return TRUE;
    }
};

CMyApp theApp;

2. 코드 설명

  • CImage 클래스: CImage는 다양한 이미지 형식(JPG, PNG, BMP 등)을 로드하고 표시할 수 있습니다.
  • OnPaint 핸들러: OnPaint()는 윈도우가 다시 그려질 때 호출되며, m_image.Draw()를 사용해 이미지를 그립니다.
  • Load 함수: 지정된 경로의 이미지를 로드합니다. 로드 실패 시 메시지 박스가 나타납니다.

3. GDI+를 사용한 이미지 로드 및 표시

GDI+는 더 복잡한 그래픽 작업에 유용합니다. MFC 프로젝트에 GDI+를 설정하려면 초기화 코드가 필요합니다.

GDI+를 사용해 이미지를 표시하는 방법

#include <afxwin.h>
#include <gdiplus.h> // GDI+ 헤더
#pragma comment(lib, "gdiplus.lib")

using namespace Gdiplus;

class CMyWindow : public CFrameWnd
{
public:
    Image* m_pImage;

    CMyWindow()
    {
        Create(NULL, _T("GDI+ Image Example"));
        m_pImage = new Image(L"example.jpg"); // GDI+에서 이미지 로드
    }

    ~CMyWindow()
    {
        delete m_pImage;
    }

    afx_msg void OnPaint()
    {
        CPaintDC dc(this);
        Graphics graphics(dc);
        if (m_pImage)
        {
            graphics.DrawImage(m_pImage, 0, 0); // 이미지를 (0,0)에 그리기
        }
    }

    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CMyWindow, CFrameWnd)
    ON_WM_PAINT()
END_MESSAGE_MAP()

class CMyApp : public CWinApp
{
public:
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;

    BOOL InitInstance()
    {
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // GDI+ 초기화
        CMyWindow* pWindow = new CMyWindow();
        m_pMainWnd = pWindow;
        pWindow->ShowWindow(SW_SHOW);
        return TRUE;
    }

    int ExitInstance()
    {
        GdiplusShutdown(gdiplusToken); // GDI+ 종료
        return CWinApp::ExitInstance();
    }
};

CMyApp theApp;

4. GDI+ 코드 설명

  • GDI+ 초기화와 종료: 프로그램 시작 시 GdiplusStartup()을 호출하고 종료 시 GdiplusShutdown()을 호출해야 합니다.
  • Image 클래스: GDI+의 Image 클래스를 사용해 다양한 형식의 이미지를 로드하고 그립니다.

5. 이미지 경로 문제 해결

  • 이미지 파일의 경로를 절대 경로로 지정하거나, 프로젝트 폴더에 이미지 파일을 복사해야 합니다.
  • 프로젝트 설정에서 유니코드(Unicode) 설정을 사용 중인지 확인해야 합니다. 그렇지 않으면 문자열 리터럴 앞에 L을 붙이지 않아도 됩니다.

6. 결론

CImage와 GDI+는 MFC에서 이미지를 처리하는 데 유용한 도구입니다. 단순한 이미지 로드와 표시에는 CImage를 사용하고, 더 복잡한 작업이 필요하다면 GDI+를 사용하는 것이 좋습니다.


🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리 입니다. 📢 위로그@WiLog 는 자기주도학습을 목적으로 라이브 스트리밍을 합니다. 📢 1인 게임 개발을 목표로 Unreal과 Blender를 학습 중입니

www.youtube.com

 

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com

 


반응형