首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请教DC如何转成内存?

2013-09-07 
请问DC怎么转成内存??本帖最后由 u011911734 于 2013-08-31 23:31:40 编辑我用 GetDC(NULL) 取得屏幕DC后

请问DC怎么转成内存??
本帖最后由 u011911734 于 2013-08-31 23:31:40 编辑 我用 GetDC(NULL); 取得屏幕DC后,想放到缓冲区内,用Socket送出去

用Bitmap 或JPG 都太麻烦了,还要处理文件头,其实我只是要把DC用StretchBlt() 显示在用户端的视窗上,文件头跟本是不必要的,如果能够直接把DC 转到内存再送出去就太方便了,不过前提是要能再转回DC...
有什么好方法? ?
[解决办法]

引用:
原来如此,所以一定要做成Bitmap然后加上BMP的文件头,才能从网络传出去在对方的窗口上显示啰?
能给个DC转成BMP的代码吗?网上看了好多转BMP的代码,但都好复杂 不好理解
谢谢了!

BOOL SaveBitmapToFile(LPCTSTR lpszFilePath, HBITMAP hBm)
{
    //  定义位图文件表头
    BITMAPFILEHEADER bmfh;
    //  定义位图信息表头
    BITMAPINFOHEADER bmih;

    //  调色板长度
    int nColorLen = 0;
    //  调色表大小
    DWORD dwRgbQuadSize = 0;
    //  位图大小
    DWORD dwBmSize = 0;
    //  分配内存的指针
    HGLOBAL    hMem = NULL;

    LPBITMAPINFOHEADER     lpbi;

    BITMAP bm;

HDC hDC;

    HANDLE hFile = NULL;

    DWORD dwWritten;

    GetObject(hBm, sizeof(BITMAP), &bm);

    bmih.biSize    = sizeof(BITMAPINFOHEADER);    // 本结构所占的字节
    bmih.biWidth    = bm.bmWidth;            // 位图宽
    bmih.biHeight    = bm.bmHeight;            // 位图高
    bmih.biPlanes    = 1;
    bmih.biBitCount        = bm.bmBitsPixel;    // 每一图素的位数
    bmih.biCompression    = BI_RGB;            // 不压缩


    bmih.biSizeImage        = 0;  //  位图大小
    bmih.biXPelsPerMeter    = 0;
bmih.biYPelsPerMeter    = 0;
    bmih.biClrUsed        = 0;
    bmih.biClrImportant    = 0;

    //  计算位图图素数据区大小 
    dwBmSize = 4 * ((bm.bmWidth * bmih.biBitCount + 31) / 32) * bm.bmHeight;

    //  如果图素位 <= 8bit,则有调色板
    if (bmih.biBitCount <= 8)
    {
        nColorLen = (1 << bm.bmBitsPixel);
    }

    //  计算调色板大小
    dwRgbQuadSize = nColorLen * sizeof(RGBQUAD);

    //  分配内存
    hMem = GlobalAlloc(GHND, dwBmSize + dwRgbQuadSize + sizeof(BITMAPINFOHEADER));

    if (NULL == hMem)
    {
        return FALSE;
    }

    //  锁定内存
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hMem);

    //  将bmih中的内容写入分配的内存中
    *lpbi = bmih;


hDC= GetDC(NULL);

    //  将位图中的数据以bits的形式放入lpData中。
    GetDIBits(hDC, hBm, 0, (DWORD)bmih.biHeight, (LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwRgbQuadSize, (BITMAPINFO *)lpbi, (DWORD)DIB_RGB_COLORS);
    
    bmfh.bfType = 0x4D42;  // 位图文件类型:BM
    bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwRgbQuadSize + dwBmSize;  // 位图大小
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwRgbQuadSize;  // 位图数据与文件头部的偏移量

    //  把上面的数据写入文件中

    hFile = CreateFile(lpszFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL
------解决方案--------------------


FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    
    if (INVALID_HANDLE_VALUE == hFile)
    {
        return FALSE;
    }

    //  写入位图文件头
    WriteFile(hFile, (LPSTR)&bmfh, sizeof(BITMAPFILEHEADER), (DWORD *)&dwWritten, NULL);
    //  写入位图数据
    WriteFile(hFile, (LPBITMAPINFOHEADER)lpbi, bmfh.bfSize - sizeof(BITMAPFILEHEADER), (DWORD *)&dwWritten, NULL);

    GlobalFree(hMem);
    CloseHandle(hFile);

    return TRUE;
}


这是bitmap写入文件的代码,网络传输的话稍微改改就行了
[解决办法]
仅供参考
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>

int main() {
    const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;

    PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);
    pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
    pbmi->bmiHeader.biWidth = uWidth;
    pbmi->bmiHeader.biHeight = uHeight;
    pbmi->bmiHeader.biPlanes = 1;
    pbmi->bmiHeader.biBitCount = 1;
    pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;
    pbmi->bmiColors[0].rgbBlue = 0;
    pbmi->bmiColors[0].rgbGreen = 0;
    pbmi->bmiColors[0].rgbRed = 0;
    pbmi->bmiColors[1].rgbBlue = 255;
    pbmi->bmiColors[1].rgbGreen = 255;
    pbmi->bmiColors[1].rgbRed = 255;

    HDC hDC = CreateCompatibleDC (0);
    void * pvBits;
    HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);
    SelectObject (hDC, hBitmap);
    HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");


//  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");
    SelectObject (hDC, hFont);
    BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);

    char c[4];
    int i, j;
    for (i = 128; i < 256; i++) {
        sprintf (c, "%02X", i);
        TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);
    }
    for (j = 0; j < 256; j++) {
        sprintf (c, "%02X", j);
        TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);
    }
    for (i = 128; i < 256; i++) {
        for (j = 0; j < 256; j++) {
            c[0] = (char) i;
            c[1] = (char) j;
            TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);
        }
    }
    for (i = 0; i < 130; i++) {
        MoveToEx (hDC, 0, i * 17, NULL);
        LineTo (hDC, uWidth, i * 17);
    }
    for (j = 0; j < 258; j++) {
        MoveToEx (hDC, j * 17, 0, NULL);
        LineTo (hDC, j * 17, uHeight);
    }

    BITMAPFILEHEADER bmfh;
    bmfh.bfType = *(PWORD) "BM";
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;


    bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;

    HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
    if (hFile != INVALID_HANDLE_VALUE) {
        DWORD dwWritten;
        WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);
        WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);
        WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);

        CloseHandle (hFile);
    }

    DeleteObject (hFont);
    DeleteObject (hBitmap);
    DeleteDC (hDC);
    LocalFree (pbmi);

    return 0;
}

热点排行