반응형
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
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+를 사용하는 것이 좋습니다.
🎬 유튜브 채널 🎬
🎬 치지직 채널 🎬
반응형
'프로그래밍' 카테고리의 다른 글
👨💻 [Unreal] 언리얼 엔진 5 에서 단축키 정리해 주세요. (0) | 2024.10.23 |
---|---|
👨💻 [MFC] 윈도우 / MFC 에서 uncompress 함수를 호출하면 결과에 쓰레기 데이터가 포함되는 경우가 있어요. (0) | 2024.10.22 |
👨💻 [MFC] MFC 에서 IP_ADAPTER_ADDRESSES 에서 netmask 주소를 얻으려면 어떻게 해야 하나요? (0) | 2024.10.21 |
👨💻 [MFC] MFC 에서 IP_ADAPTER_ADDRESSES 에서 getway 주소를 얻으려면 어떻게 해야 하나요? (0) | 2024.10.21 |
👨💻 [MFC] MFC 에서 IP_ADAPTER_ADDRESSES 에서 IP 주소를 얻으려면 어떻게 해야 하나요? (0) | 2024.10.21 |