ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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;
    }

    '공장 이야기' 카테고리의 다른 글

    SIP 설정하기  (0) 2009.10.12
    자주 사용하는 메크로...  (0) 2009.09.30
    Windows Mobile에서 유니코드 변환  (0) 2009.09.29
    위피에서 lrotl, lrotr 구현  (0) 2009.08.12
    Windows Mobile에서 PPP 연결...  (0) 2009.06.12
Designed by Tistory.