본문 바로가기

프로그램언어/C++

API 비트맵

비트맵이란 이미지를 저장하는 것으로 픽셀의 색상, 이미지 크기, 해상도등의 정보를 2차원 배열로 저장하는 있는 이미지 데이터이다.

 

비트맵의 종류

비트맵은 2가지 종류로 장치 종속적인 비트맵(DDB : Device Dependent Bitmap)과 장치 독립적 비트맵(DIB : Deviec Independent Bitmap)이 있다.

 

DDB의 구조

typedef struct tagBITMAP(
    LONG bmType;                 // 비트맵 타입
    LONG bmWidth;               // 가로 크기
    LONG bmHeight;              // 세로 크기
    LONG bmWidthBytes;        // 비트맵 이미지 한줄에 표현될 바이트 수
    WORD bmPlanes;             // 색상면의 개수
    WORD bmBitsPixel;           // 한 픽셀에 필요한 비트수
    LPVOID bmBits;               // 실제 비트맵 데이터를 가르키는 포인터
)BITMAP;

 

DDB의 생성하는 함수

CreateBitmap()함수

CreateBitmap()함수는 흑백 비트맵을 만들 때 주로 사용한다.

HBITMAP CreateBitmap(
    int nWidth,                    //  이미지 폭
    int nHeight,                   // 이미지 높이
    UINT cPlanes,                // 장치에 있는 색상면의 수이며 반드시 1이여야 한다.
    UINT cBitsPerPel,           // 픽세의 색상을 결정하기 위한 필료한 비트 수
    const VOID *lpvBits        // 비트맵의 래스터 데이터로 반드시 워드(2바이트)배열로 이루어져야 한다.
);

 

CreateCompatibleBitmap()함수

CreateCompatibleBitmap()함수는 컬러 비트맵을 만들 때 주로 사용한다.

HBITMAP CreateCompatibleBitmap(
    HDC hdc,              // dc의 핸들을 지정
    int nWidth,            // 비트맵의 폭
    int nHeight            // 비트맵의 높이
);

 

비트맵 출력하기

BitBlt()함수

BOOL BitBlt(
    HDC hdcDest,     // 비트맵이 복사될 대상 DC
    int nXDest,         // 비트맵이 복사될 대상의 상단 X좌표
    int nYDest,         // 비트맵이 복사될 대상의 상단 Y좌표
    int nWidth,        // 복사될 비트맵의 폭
    int nHeight,       // 복사될 비트맵의 높이
    HDC hdcSrc,      // 복사될 비트맵을 가지고 있는 DC
    int nXSrc,          // 복사될 비트맵의 상단 X좌표
    int nYSrc,         // 복사될 비트맵의 상단 Y좌표
    DWORD dwRop     // ROP코드, 복사원 및 복사처의 비트맵 색상이 논리연산될 방법을 지정
);

 

비트맵 확대, 축소하기

StretchBlt()함수

BOOL StretchBlt(

    HDC hdcDest,        // 비트맵이 복사될 대상 DC

    int nXOriginDest,    // 비트맵이 복사될 대상의 좌측 X좌표

    int nYOriginDest,    //비트맵이 복사될 대상의 좌측 Y좌표
    int nWidthDest,      // 비트맵이 복사될 폭

    int nHeightDest,      // 비트맵이 복사될 높이

    HDC hdcSrc,          //복사될 비트맵을 가지고 있는 DC 

    int nXOriginSrc,      // 복사될 비트맵의 좌측 X좌표

    int nYOriginSrc,       // 복사될 비트맵의 좌측 Y좌표

    int nWidthSrc,        // 복사될 비트맵의 폭

    int nHeightSrc,       // 복사될 비트맵의 높이
    DWORD dwRop     // ROP 코드, 복사원 및 복사처의 비트맵 색상이 논리연산될 방법을 지정

);

 

LoadBitmap()함수

LoadBitmap()함수를 이용하여 리소스에 등록된 이미지 불러오기

HBITMAP LoadBitmap(
    HINSTANCE hInstance,          // 비트맵 리소스를 가진 인스턴스 핸들
    LPCTSTR lpBitmapName        // 비트맵 리소스 ID를 지정하는 문자열 포인터. 정수형으로 정의된 비트맵을 읽을 때는
                                           // MAKEINTRESOURCE 매크로를 사용
);

 

비트맵 출력하기

위와 같이 집그리기

 

#include <windows.h>

#include <TCHAR.H>

#include "resource.h"

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);

HINSTANCE hInst;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)

{

    HWND hwnd;

    MSG msg;

    WNDCLASS WndClass;

    hInst = hInstance

    WndClass.style = CS_HREDRAW | CS_VREDRAW

    WndClass.lpfnWndProc = WndProc;

    WndClass.cbClsExtra = 0;

    WndClass.cbWndExtra = 0;

    WndClass.hInstance = hInstance

    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);

    WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

    WndClass.lpszMenuName = NULL

    WndClass.lpszClassName = _T("Window Class Name");

    RegisterClass(&WndClass);

    hwnd = CreateWindow(_T("Window Class Name"), _T("Window Title Name"), WS_OVERLAPPEDWINDOW,

                 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);

    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }

    return (int)msg.wParam;

}

 

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

    HDC hdc, memdc;

    PAINTSTRUCT ps;

    static HBITMAP hBitmap;

 

    switch (iMsg)

    {

    case WM_CREATE:

        hBitmap = (HBITMAP)LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));

        break;

    case WM_PAINT:

        hdc = BeginPaint(hwnd, &ps);

        memdc = CreateCompatibleDC(hdc);

        SelectObject(memdc, hBitmap);

        BitBlt(hdc, 0, 0, 332, 240, memdc, 0, 0, SRCCOPY);

        DeleteDC(memdc);

        EndPaint(hwnd, &ps);

        break;

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);

}

실행 결과

 

이미지 크기 조정

가져오기 버튼을 선택하여 이미지를 불러온다.

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

    // ... 중간생략...

 

    switch (iMsg)

    {

    case WM_CREATE:

        hBitmap = (HBITMAP)LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));

        break;

    case WM_PAINT:

        hdc = BeginPaint(hwnd, &ps);

        memdc = CreateCompatibleDC(hdc);

        SelectObject(memdc, hBitmap);

        StretchBlt(hdc, 0, 0, 1060, 530, memdc, 0, 0, 530, 530, SRCCOPY);

        DeleteDC(memdc);

        EndPaint(hwnd, &ps);

        break;

    // ... 중간생략...

    }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);

}

실행 결과]

 

'프로그램언어 > C++' 카테고리의 다른 글

ROP모드로 이미지 마스크 설정  (0) 2020.12.22
API 비트맵2  (0) 2020.09.28
API 단축키  (0) 2020.09.28
공용 대화상자 사용하기2  (0) 2020.09.25
API 공용 대화상자 사용1  (0) 2020.09.25