• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 74, 文章 - 0, 評論 - 26, 引用 - 0
            數據加載中……

            Write HBITMAP Object in to BMP File 轉

            void WriteBMPFile(HBITMAP bitmap, LPTSTR filename, HDC hDC)
            {
            BITMAP bmp;
            PBITMAPINFO pbmi;
            WORD cClrBits;
            HANDLE hf; // file handle
            BITMAPFILEHEADER hdr; // bitmap file-header
            PBITMAPINFOHEADER pbih; // bitmap info-header
            LPBYTE lpBits; // memory pointer
            DWORD dwTotal; // total count of bytes
            DWORD cb; // incremental count of bytes
            BYTE *hp; // byte pointer
            DWORD dwTmp;

            // create the bitmapinfo header information

            if (!GetObject( (bitmap, sizeof(BITMAP), (LPSTR)&bmp)){
            AfxMessageBox("Could not retrieve bitmap info");
            return;
            }

            // Convert the color format to a count of bits.
            cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
            if (cClrBits == 1)
            cClrBits = 1;
            else if (cClrBits <= 4)
            cClrBits = 4;
            else if (cClrBits <= 8)
            cClrBits = 8;
            else if (cClrBits <= 16)
            cClrBits = 16;
            else if (cClrBits <= 24)
            cClrBits = 24;
            else cClrBits = 32;

            // Allocate memory for the BITMAPINFO structure.
            if (cClrBits != 24)
            pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
            sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1<< cClrBits));
            else
            pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER));

            // Initialize the fields in the BITMAPINFO structure.

            pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
            pbmi->bmiHeader.biWidth = bmp.bmWidth;
            pbmi->bmiHeader.biHeight = bmp.bmHeight;
            pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
            pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
            if (cClrBits < 24)
            pbmi->bmiHeader.biClrUsed = (1<<cClrBits);

            // If the bitmap is not compressed, set the BI_RGB flag.
            pbmi->bmiHeader.biCompression = BI_RGB;

            // Compute the number of bytes in the array of color
            // indices and store the result in biSizeImage.
            pbmi->bmiHeader.biSizeImage = (pbmi->bmiHeader.biWidth + 7) /8 * pbmi->bmiHeader.biHeight * cClrBits;
            // Set biClrImportant to 0, indicating that all of the
            // device colors are important.
            pbmi->bmiHeader.biClrImportant = 0;

            // now open file and save the data
            pbih = (PBITMAPINFOHEADER) pbmi;
            lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);

            if (!lpBits) {
            AfxMessageBox("writeBMP::Could not allocate memory");
            return;
            }

            // Retrieve the color table (RGBQUAD array) and the bits
            if (!GetDIBits(hDC, HBITMAP(bitmap), 0, (WORD) pbih->biHeight, lpBits, pbmi,
            DIB_RGB_COLORS)) {
            AfxMessageBox("writeBMP::GetDIB error");
            return;
            }

            // Create the .BMP file.
            hf = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, (DWORD) 0,
            NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
            (HANDLE) NULL);
            if (hf == INVALID_HANDLE_VALUE){
            AfxMessageBox("Could not create file for writing");
            return;
            }
            hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
            // Compute the size of the entire file.
            hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
            pbih->biSize + pbih->biClrUsed
            * sizeof(RGBQUAD) + pbih->biSizeImage);
            hdr.bfReserved1 = 0;
            hdr.bfReserved2 = 0;

            // Compute the offset to the array of color indices.
            hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
            pbih->biSize + pbih->biClrUsed
            * sizeof (RGBQUAD);

            // Copy the BITMAPFILEHEADER into the .BMP file.
            if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
            (LPDWORD) &dwTmp, NULL)) {
            AfxMessageBox("Could not write in to file");
            return;
            }

            // Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
            if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
            + pbih->biClrUsed * sizeof (RGBQUAD),
            (LPDWORD) &dwTmp, ( NULL))){
            AfxMessageBox("Could not write in to file");
            return;
            }


            // Copy the array of color indices into the .BMP file.
            dwTotal = cb = pbih->biSizeImage;
            hp = lpBits;
            if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL)){
            AfxMessageBox("Could not write in to file");
            return;
            }

            // Close the .BMP file.
            if (!CloseHandle(hf)){
            AfxMessageBox("Could not close file");
            return;
            }

            // Free memory.
            GlobalFree((HGLOBAL)lpBits);
            }

            posted on 2009-02-16 11:32 井泉 閱讀(1203) 評論(2)  編輯 收藏 引用

            評論

            # re: Write HBITMAP Object in to BMP File 轉  回復  更多評論   

            結果是什么
            2010-03-09 16:12 | nfl 2010

            # re: Write HBITMAP Object in to BMP File 轉  回復  更多評論   

            I have the functions to check if there is an image on the clipboard and to get the HBITMAP data of that image. Now I only have one question: How can I save, in C++, an HBITMAP structure into a Bitmap file on the computer?
            2011-04-20 18:36 | Human Health
            久久强奷乱码老熟女| 日韩亚洲欧美久久久www综合网| 99久久精品国产一区二区| 久久er国产精品免费观看2| 国产精品九九久久精品女同亚洲欧美日韩综合区| 91精品国产高清91久久久久久| 九九精品99久久久香蕉| 国产叼嘿久久精品久久| 久久精品国产免费观看三人同眠| 欧美熟妇另类久久久久久不卡 | 久久精品国产亚洲AV蜜臀色欲| 无码久久精品国产亚洲Av影片| 国产99久久九九精品无码| 精品久久久中文字幕人妻| 91麻精品国产91久久久久| 日韩AV无码久久一区二区| 精品久久久久久99人妻| AV狠狠色丁香婷婷综合久久 | 婷婷国产天堂久久综合五月| 99久久人妻无码精品系列蜜桃| 日本久久久久久久久久| 久久综合狠狠综合久久激情 | 久久精品中文字幕一区| 国产91久久综合| 国产成人香蕉久久久久| 亚洲精品高清国产一久久| 日韩人妻无码精品久久久不卡 | 99久久99久久精品免费看蜜桃| 青青草国产97免久久费观看| 一本大道久久a久久精品综合| 日韩人妻无码精品久久久不卡 | 免费精品久久久久久中文字幕| 日本福利片国产午夜久久| 婷婷伊人久久大香线蕉AV| 中文字幕久久波多野结衣av| 亚洲国产精品综合久久网络| 久久精品国产亚洲Aⅴ香蕉| 精品无码人妻久久久久久| 日韩十八禁一区二区久久| 久久精品亚洲欧美日韩久久| 久久不见久久见免费影院www日本|