• <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
            日本精品久久久中文字幕| 亚洲欧洲精品成人久久曰影片 | 久久香蕉一级毛片| 成人免费网站久久久| 久久午夜无码鲁丝片| 国产精品久久99| 久久久久国产日韩精品网站| 亚洲欧美国产精品专区久久| 天天爽天天狠久久久综合麻豆| 99久久国产综合精品麻豆| 日韩欧美亚洲综合久久影院Ds| 2021国内久久精品| 国产精品伦理久久久久久 | 久久中文字幕无码专区| 亚洲国产精品无码久久久不卡| 久久青青草原综合伊人| 久久综合视频网| 久久国产综合精品五月天| 色偷偷偷久久伊人大杳蕉| 无码人妻久久一区二区三区蜜桃| 日韩精品久久久久久免费| 一本久久免费视频| 久久婷婷久久一区二区三区| 一本色综合网久久| 亚洲日本va午夜中文字幕久久| 青青青青久久精品国产| 久久亚洲美女精品国产精品| 久久这里都是精品| 日本加勒比久久精品| 品成人欧美大片久久国产欧美| 久久久久久久亚洲Av无码| 国产aⅴ激情无码久久| 久久婷婷是五月综合色狠狠| 久久国产精品无码网站| 国产精品青草久久久久福利99| 久久丫精品国产亚洲av| 亚洲国产一成人久久精品| 久久精品国产99久久久古代| 久久久黄色大片| 无遮挡粉嫩小泬久久久久久久 | 久久久久夜夜夜精品国产|