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.