공장 이야기

Windows Mobile 에서 DC를 Bitmap 저장

바다가소주라면- 2009. 9. 21. 16:04

어디서 가지고 온지는 기억이 안남...,ㅡ,ㅡ;;;

 

_SaveBitmap(HDC dcSave, HBITMAP bmSave, LPTSTR pszFileName)
{
    BITMAP           bmpSave     = { 0, };
    BITMAPINFO       bmiSave     = { 0, };
    BITMAPFILEHEADER hdrSave     = { 0, };
    DWORD            dwByteCount = 0;
    void*            pBuffer     = NULL;
    HDC              dcDest      = NULL;
    HBITMAP          bmDest      = NULL;
    HBITMAP          bmDestOld   = NULL;
    HANDLE           hFile       = NULL;

    if(NULL == bmSave)
        return FALSE;
    if(NULL == dcSave)
        return FALSE;

    ::GetObject(bmSave, sizeof(BITMAP), &bmpSave);

    bmiSave.bmiHeader.biHeight        = bmpSave.bmHeight;
    bmiSave.bmiHeader.biWidth         = bmpSave.bmWidth;
    bmiSave.bmiHeader.biPlanes        = 1;
    bmiSave.bmiHeader.biBitCount      = 24;
    bmiSave.bmiHeader.biSize          = sizeof(bmiSave.bmiHeader);
    bmiSave.bmiHeader.biSizeImage     = ((bmiSave.bmiHeader.biWidth + 3) & (~3)) * bmiSave.bmiHeader.biHeight * bmiSave.bmiHeader.biBitCount / 8;
    bmiSave.bmiHeader.biXPelsPerMeter = 3780;
    bmiSave.bmiHeader.biYPelsPerMeter = 3780;

    bmDest = ::CreateDIBSection(dcSave, &bmiSave, DIB_RGB_COLORS, (void**)&pBuffer, NULL, 0);

    // bitmap 복사하는 곳. 빼면 저장 안됨.
    dcDest = ::CreateCompatibleDC(dcSave);
    bmDestOld = (HBITMAP)::SelectObject(dcDest, bmDest);
    ::BitBlt(dcDest, 0, 0, bmpSave.bmWidth, bmpSave.bmHeight, dcSave, 0, 0, SRCCOPY);
    ::SelectObject(dcDest, bmDestOld);
    ::DeleteDC(dcDest);

    hFile = ::CreateFile(pszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        hdrSave.bfType  = ((WORD) ('M' << 8) | 'B');
        hdrSave.bfSize  = sizeof(hdrSave) + sizeof(BITMAPINFOHEADER);
        hdrSave.bfReserved1 = 0;
        hdrSave.bfReserved2 = 0;
        hdrSave.bfOffBits = hdrSave.bfSize;

        ::WriteFile(hFile, &hdrSave, sizeof(hdrSave), &dwByteCount, NULL);
        ::WriteFile(hFile, &bmiSave.bmiHeader, sizeof(bmiSave.bmiHeader), &dwByteCount, NULL);
        ::WriteFile(hFile, pBuffer, bmiSave.bmiHeader.biSizeImage, &dwByteCount, NULL);

        ::CloseHandle(hFile);
    }

    ::DeleteObject(bmDest);
    bmDest = NULL;

    return TRUE;
}