공부

24bit BMP 파일 읽어서 윈도우 출력

글로벌디노 2020. 8. 25. 01:49

MyClass.h

#pragma once
class MyClass
{
public:
	MyClass();
	~MyClass();

private:
	BITMAPINFO bitMapInfo;
	BYTE* imgData;
	DWORD imgSize;

public:
	BOOL LoadBMPFile(const TCHAR* fileName);
	void Render(HDC hdc);
};

 

MyClass.cpp

#include "framework.h"
#include "MyClass.h"

#include <stdio.h>

MyClass::MyClass()
{
    bitMapInfo = { 0 };
    imgData = nullptr;
    imgSize = 0;
}

MyClass::~MyClass()
{
    if (imgData != nullptr)
        delete imgData;
}

BOOL MyClass::LoadBMPFile(const TCHAR* fileName)
{
    FILE* pf;
    if (_tfopen_s(&pf, fileName, TEXT("rb")) != 0)
        return FALSE;

    // 파일헤더 읽기
    BITMAPFILEHEADER bmfh;
    fread_s(&bmfh, sizeof(BITMAPFILEHEADER), sizeof(BITMAPFILEHEADER), 1, pf);

    // bm 확인
    if (bmfh.bfType != 0x4D42)
    {
        fclose(pf);
        return FALSE;
    }

    // bitmap정보헤더 읽기
    fread_s(&bitMapInfo.bmiHeader, sizeof(BITMAPINFOHEADER), sizeof(BITMAPINFOHEADER), 1, pf);


    // 이미지 크기 계산해서 메모리할당
    LONG width = bitMapInfo.bmiHeader.biWidth;
    LONG height = bitMapInfo.bmiHeader.biHeight;
    WORD bitCnt = bitMapInfo.bmiHeader.biBitCount;
    
    DWORD pitch = (DWORD)((width * (bitCnt >> 3) + 3) & ~3);
    imgSize = pitch * height;

    imgData = new BYTE[imgSize];
    
    // 파일에서 이미지데이터 읽기
    fread_s(imgData, imgSize, imgSize, 1, pf);

    fclose(pf);

    return TRUE;
}

void MyClass::Render(HDC hdc)
{
    StretchDIBits(hdc, 
        0, 0, bitMapInfo.bmiHeader.biWidth * 30, bitMapInfo.bmiHeader.biHeight * 30,
        0, 0, bitMapInfo.bmiHeader.biWidth, bitMapInfo.bmiHeader.biHeight,
        imgData, 
        &bitMapInfo,
        DIB_RGB_COLORS, SRCCOPY);
}

 

반응형

'공부' 카테고리의 다른 글

20200901 공부  (0) 2020.09.02
20200831 공부  (0) 2020.09.01
VirtualAlloc 함수를 이용한 Dynamic Array Design  (0) 2020.08.15
쓰레드 동기화 인터락 함수  (0) 2020.08.06
쓰레드 동기화, 임계영역 접근 동기화  (0) 2020.08.06