C++/MFC
CImage로 이미지 로드하는 다양한 방법
Dongmin Jang
2020. 9. 15. 13:26
MFC register image to mfc forms when buttons clicked.
1. CImage.Draw()
void CEx1ImageDlg::OnBnClickedBtnImage()
{
CRect rect;
m_staticPCImage.GetClientRect(&rect);
CImage image;
LPCTSTR filename = _T("res\\image\\test.jpg");
HRESULT hResult = image.Load(filename);
if (FAILED(hResult))
{
AfxMessageBox(_T("ERROR: Failed to load"));
return;
}
HDC hdc = ::GetDC(m_staticPCImage.m_hWnd);
image.Draw(hdc, rect);
::ReleaseDC(m_staticPCImage.m_hWnd, hdc);
image.Destroy();
}
2. CImage.StrecthBlt()
void CEx1ImageDlg::OnBnClickedBtnImage()
{
CImage image;
LPCTSTR filename = _T("res\\image\\test.jpg");
HRESULT hResult = image.Load(filename);
if (FAILED(hResult))
{
AfxMessageBox(_T("ERROR: Failed to load"));
return;
}
CRect rect;
m_staticPCImage.GetClientRect(&rect);
HDC hdc = ::GetDC(m_staticPCImage.m_hWnd);
image.StretchBlt(hdc, 0, 0, rect.Width(), rect.Height());
::ReleaseDC(m_staticPCImage.m_hWnd, hdc);
image.Destroy();
}
3. (수정중)CImage.BitBlt()
void CEx1ImageDlg::OnBnClickedBtnImage()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
CImage image;
LPCTSTR filename = _T("res\\image\\test.jpg");
HRESULT hResult = image.Load(filename);
if (FAILED(hResult))
{
AfxMessageBox(_T("ERROR: Failed to load"));
return;
}
int bpp = image.GetBPP();
assert((bpp == 8 || bpp == 24 || bpp == 32));
int padding = 0;
//32 bit image is always DWORD aligned because each pixel requires 4 bytes
if (bpp < 32)
padding = 4 - (image.GetWidth() % 4);
if (padding == 4)
padding = 0;
int border = 0;
//32 bit image is always DWORD aligned because each pixel requires 4 bytes
if (bpp < 32)
{
border = 4 - (image.GetWidth() % 4);
}
CRect rect;
m_staticPCImage.GetClientRect(&rect);
BITMAPINFO *bitinfo = new BITMAPINFO[256 * sizeof(RGBQUAD)];
bitinfo->bmiHeader.biBitCount = bpp;
bitinfo->bmiHeader.biWidth = image.GetWidth();
bitinfo->bmiHeader.biHeight = image.GetHeight();
bitinfo->bmiHeader.biPlanes = 1;
bitinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitinfo->bmiHeader.biCompression = BI_RGB;
bitinfo->bmiHeader.biClrImportant = 0;
bitinfo->bmiHeader.biClrUsed = 0;
bitinfo->bmiHeader.biSizeImage = 0;
bitinfo->bmiHeader.biXPelsPerMeter = 0;
bitinfo->bmiHeader.biYPelsPerMeter = 0;
if (image.GetWidth() == rect.Width() && image.GetHeight() == rect.Height())
{
SetDIBitsToDevice(image.GetDC(),
0, 0, rect.Width(), rect.Height(),
0, 0, 0, image.GetHeight(),
image.GetBits(), bitinfo, DIB_RGB_COLORS);
}
else
{
int destx = 0, desty = 0;
int destw = rect.Width();
int desth = rect.Height();
int imgx = 0, imgy = 0;
int imgWidth = image.GetWidth();
int imgHeight = image.GetHeight();
StretchDIBits(image.GetDC(),
destx, desty, destw, desth,
imgx, imgy, imgWidth, imgHeight,
image.GetBits(), bitinfo, DIB_RGB_COLORS, SRCCOPY);
}
HDC hdc = ::GetDC(m_staticPCImage.m_hWnd);
image.BitBlt(hdc, 0, 0);
::ReleaseDC(m_staticPCImage.m_hWnd, hdc);
if (bitinfo)
{
delete[] bitinfo;
bitinfo = nullptr;
}
image.ReleaseDC();
image.Destroy();
}
4.
5.
6.
7.