Priceless

[CV] Visual Studio를 통한 비트맵 출력 프로그램 생성 본문

ComputerVision/OpenCV

[CV] Visual Studio를 통한 비트맵 출력 프로그램 생성

Hyun__ 2023. 10. 21. 19:20

Visual Studio 2022 기준

 

Visual Studio를 열고

새 프로젝트 생성을 누른다

Windows 데스크톱 애플리케이션 선택

 

솔루션 및 프로젝트를 같은 디렉토리에 배치 항목을 체크한 후 

원하는 디렉토리에 프로젝트 생성

 

아래와 같이 실행할 수 있는 프로그램의 기본 구조를 포함한 코드가 작성되어 있다

 

BmpShow.cpp

 

 

이대로 실행하면 아무 화면 구성 요소가 없는 프로그램이 나타난다

 

 

프로그램 요소 중 마우스 왼쪽 버튼을 클릭했을 때 반응을 추가하기 위해

cpp 파일의 switch 문 내에 아래 코드를 추가한다

파일 제일 상단에 파일을 입출력하기 위해

#include<stdio.h>

를 추가한다

 

cat.bmp 파일을 출력하기 위해

같은 프로젝트 폴더 내에 cat.bmp 파일을 추가한다

case WM_LBUTTONDOWN: {
    // 직접 작성
    FILE* fp = NULL;
    fopen_s(&fp, "cat.bmp", "rb");

    if (!fp)
        break;

    BITMAPFILEHEADER bmfh;
    BITMAPINFOHEADER bmih;

    fread(&bmfh, sizeof(BITMAPFILEHEADER), 1, fp);
    fread(&bmih, sizeof(BITMAPINFOHEADER), 1, fp);

    LONG nWidth = bmih.biWidth;
    LONG nHeight = bmih.biHeight;
    WORD nBitCount = bmih.biBitCount;

    DWORD dwWidthStep = (DWORD)((nWidth * nBitCount / 8 + 3) & ~3);
    DWORD dwSizeImage = nHeight * dwWidthStep;

    DWORD dwDibSize;
    if (nBitCount == 24)
        dwDibSize = sizeof(BITMAPINFOHEADER) + dwSizeImage;
    else
        dwDibSize = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1 << nBitCount) + dwSizeImage;

    BYTE* pDib = new BYTE[dwDibSize];

    fseek(fp, sizeof(BITMAPFILEHEADER), SEEK_SET);
    fread(pDib, sizeof(BYTE), dwDibSize, fp);

    LPVOID lpvBits;
    if (nBitCount == 24)
        lpvBits = pDib + sizeof(BITMAPINFOHEADER);
    else
        lpvBits = pDib + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1 << nBitCount);

    HDC hdc = GetDC(hWnd);
    int x = LOWORD(lParam);
    int y = HIWORD(lParam);
    ::SetDIBitsToDevice(hdc, x, y, nWidth, nHeight, 0, 0, 0, nHeight, lpvBits,
        (BITMAPINFO*)pDib, DIB_RGB_COLORS);
    ReleaseDC(hWnd, hdc);

    delete[] pDib;
    fclose(fp);

}
break;

 

 

cat.bmp

 

 

그리고 코드를 실행한 결과

마우스 왼쪽을 클릭하면 비트맵 파일이 나타나는 프로그램이 실행된다

 

창의 크기를 변경하는 경우 프로그램 내의 이미지가 모두 사라지는데

이를 수정하기 위해서는 switch 문 내의

case WM_PAINT: 

에 코드를 추가하면 해결할 수 있다

'ComputerVision > OpenCV' 카테고리의 다른 글

[OpenCV] Mat 클래스  (0) 2023.10.23
[OpenCV] Windows에서 OpenCV 설치, 설정 및 사용하기  (0) 2023.10.22
[OpenCV]OpenCV 클래스  (0) 2023.10.22
[OpenCV] OpenCV 모듈  (0) 2023.10.22
[Vision] BMP 파일(비트맵 파일)  (0) 2023.10.21