• <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
            數(shù)據(jù)加載中……

            Write HBITMAP Object in to BMP File 轉(zhuǎn)

            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 井泉 閱讀(1213) 評論(2)  編輯 收藏 引用

            評論

            # re: Write HBITMAP Object in to BMP File 轉(zhuǎn)  回復  更多評論   

            結(jié)果是什么
            2010-03-09 16:12 | nfl 2010

            # re: Write HBITMAP Object in to BMP File 轉(zhuǎn)  回復  更多評論   

            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
            久久国产精品无码HDAV | 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 精品人妻久久久久久888| 久久久无码精品亚洲日韩按摩| 久久99热精品| 一本久久a久久精品综合香蕉| 亚洲AV日韩精品久久久久久| 久久99国产精品久久久| 亚洲?V乱码久久精品蜜桃 | 亚洲中文字幕无码久久精品1| 久久香蕉国产线看观看乱码| 伊人热热久久原色播放www| 欧美一区二区三区久久综| 久久国产精品二国产精品| 亚洲中文字幕久久精品无码APP| 久久亚洲国产精品一区二区| 97精品伊人久久久大香线蕉| 久久久久亚洲AV无码专区桃色| 国产欧美久久久精品| 久久精品人人槡人妻人人玩AV| 国产偷久久久精品专区| 中文字幕无码久久久| 久久久国产精品| 91精品国产综合久久香蕉| 国产精品久久波多野结衣| 色偷偷88888欧美精品久久久| 亚洲国产日韩欧美久久| 精品国产91久久久久久久a| 国产精品久久影院| 99久久99久久精品免费看蜜桃| 精品久久久无码21p发布| 99久久做夜夜爱天天做精品| 久久久精品久久久久久| 国产成人精品久久亚洲高清不卡 | 久久夜色tv网站| 国产精品99久久久久久猫咪| 91超碰碰碰碰久久久久久综合| 国产精品免费久久| 久久久久久亚洲精品不卡| 日日狠狠久久偷偷色综合0| 一级a性色生活片久久无 |