• <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, 評(píng)論 - 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) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

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

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

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

            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

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久夜色精品国产噜噜亚洲AV| 看全色黄大色大片免费久久久| 免费观看成人久久网免费观看| 97久久香蕉国产线看观看| 久久99国产综合精品免费| 热久久这里只有精品| 久久66热人妻偷产精品9| 久久精品国产久精国产思思| 久久精品国产亚洲AV大全| 久久精品国产亚洲av麻豆蜜芽| 漂亮人妻被黑人久久精品| 人妻精品久久久久中文字幕一冢本| 久久人人爽人人爽人人片AV麻烦| 久久国产精品无| 2021国产成人精品久久| 久久久久久噜噜精品免费直播| 色播久久人人爽人人爽人人片aV| 亚洲日本va中文字幕久久| 久久91亚洲人成电影网站| 色婷婷噜噜久久国产精品12p| 色99久久久久高潮综合影院| 久久久久久国产精品美女| 精品人妻伦九区久久AAA片69| 久久久噜噜噜久久中文福利| 狠狠色噜噜狠狠狠狠狠色综合久久| 曰曰摸天天摸人人看久久久| 久久99热这里只有精品66| 久久综合给合久久狠狠狠97色 | 久久亚洲AV无码精品色午夜麻豆| 亚洲欧洲日产国码无码久久99| 国产真实乱对白精彩久久| 色诱久久久久综合网ywww| 久久综合中文字幕| 中文字幕无码久久久| 品成人欧美大片久久国产欧美| 午夜久久久久久禁播电影| 一本久久a久久精品综合夜夜| 麻豆av久久av盛宴av| 久久婷婷国产麻豆91天堂| 亚洲精品无码专区久久同性男| 国产精品99久久99久久久|