티스토리 뷰
이번에는 이미지를 왼쪽으로 90도 회전시키는 실습을 해보겠습니다.
먼저 앞서 많이 진행했던
이미지 출력을 시켜보겠습니다.
Dlg.h파일에 가서 CImage m_image 변수를 추가시켜줍니다.
// CRotatExamDlg 대화 상자
class CRotatExamDlg : public CDialogEx
{
CImage m_image;
// 생성입니다.
|
cs |
그다음 Dlg.cpp 파일에 가서
아래와 같이 OnInitDialog()에는 m_image에 로드시켜주는 코드를 추가시켜주고
OnPaint()에는 CPaintDC를 if문 밖으로 빼주시고
CDialogEx::OnPaint();를 주석 처리해줍니다.
그리고 m_image를 Draw시키는 코드를 추가시켜줍니다.
마지막으로 원하는 이미지를 다운받아 test.bmp 파일로 해당 소스 파일에 넣어줍니다.
BOOL CRotatExamDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.
m_image.Load(L"test.bmp");
return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
void CRotatExamDlg::OnPaint()
{
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 아이콘을 그립니다.
dc.DrawIcon(x, y, m_hIcon);
}
else
{
m_image.Draw(dc, 10, 10);
//CDialogEx::OnPaint();
}
}
|
cs |
프로그램을 실행 시켜주면 이미지가 출력됩니다.
이미지 회전
Dlg.h 파일에 CImage변수 m_rotat_image를 추가시켜줍니다.
// CRotatExamDlg 대화 상자
class CRotatExamDlg : public CDialogEx
{
CImage m_image;
CImage m_rotat_image;
// 생성입니다.
public:
|
cs |
Dlg.cpp 파일에 OnInitDialog()에
아래와 같이 m_rotat_image를 create 해주는 소스를 추가시켜줍니다.
BOOL CRotatExamDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.
m_image.Load(L"test.bmp");
m_rotat_image.Create(m_image.GetWidth(), m_image.GetHeight(), m_image.GetBPP(), 0);
//m_image와 동일한 크기의 m_rotat_image를 create
return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
|
cs |
다음 리소스 뷰에 Dialog로 가서
버튼 하나를 추가시켜준다음 버튼의 ID를 IDC_ROTAT_BTN으로 바꿔주시고
버튼을 더블클릭해줍니다.
그러면 버튼 이벤트 함수가 하나 생기는데 거기에
아래의 코드를 추가시켜줍니다.
void CRotatExamDlg::OnBnClickedRotatBtn()
{
CClientDC dc(this);
int h = m_image.GetHeight(); //이미지의 세로길이
int w = m_image.GetWidth(); // 이미지의 가로길이
COLORREF* temp_color = new COLORREF[w]; // 배열 동적할당
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
temp_color[x] = m_image.GetPixel(x, y);
// 원본 이미지의 픽셀을 getpixel로 얻고 temp_color배열에 잠시 저장
m_rotat_image.SetPixel(y, x, temp_color[x]);
// temp_color에 저장된 픽셀의 x,y점을 바꿔서 m_rotat_image에 setpixel로 넣어줌
}
}
m_rotat_image.Draw(dc, 10, 10); // (10,10)을 시작으로 이미지 draw
delete[] temp_color;
}
|
cs |
마지막으로 프로그램을 실행시켜주시고
이미지 회전 버튼을 눌러주시면 아래와 같은 결과가 출력되게 됩니다~!
'프로그래밍 > MFC 프로그래밍' 카테고리의 다른 글
MFC 이미지 색반전 (Invert color image) (1) | 2020.01.14 |
---|---|
MFC 픽셀값 사용해서 이미지 확대 시키기 (0) | 2020.01.13 |
MFC 히스토그램 그리기 (8) | 2020.01.07 |
MFC 키보드로 사각형 이동시키기 (16) | 2020.01.03 |
MFC CImage로 이미지 출력하기 (1) | 2020.01.02 |