我用下面的代码把桌面保存到文件"pict.bmp"中。保存成功。
现在我想直接输出CSTring,可是不正确。请问原因。我该怎么改?
我不能获得lpData。但它确实存在,并正确。 CDC dc;
CDC tdc;
CBitmap bm;
CBitmap *pOld; dc.CreateDC("DISPLAY", NULL, NULL, NULL);
int Width = GetSystemMetrics(SM_CXSCREEN);
int Height = GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc, Width, Height);
tdc.CreateCompatibleDC(&dc);
pOld = tdc.SelectObject(&bm);

//复制图像
tdc.BitBlt(0, 0, Width, Height, &dc, 0, 0, SRCCOPY);
tdc.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);

DWORD size = btm.bmWidthBytes * btm.bmHeight;
LPSTR lpData = (LPSTR)GlobalAllocPtr(GPTR, size);

CString st;
st.Format("%d, %d",size, sizeof(lpData));
MessageBox(st);//输出“5184000, 4”
BITMAPINFOHEADER bih;
bih.biBitCount = btm.bmBitsPixel;
bih.biClrImportant = 0;
bih.biClrUsed = 0;
bih.biCompression = 0;
bih.biHeight = btm.bmHeight;
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = size;
bih.biWidth = btm.bmWidth;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
GetDIBits(dc, bm, 0, bih.biHeight, lpData, (BITMAPINFO*)&bih, DIB_RGB_COLORS);

st.Format("%d, %d",size, sizeof(lpData));
MessageBox(st);//输出“5184000, 4” CString stout;
stout = lpData;
st.Format("%d",stout.GetLength());
MessageBox(st);//输出“3” BITMAPFILEHEADER bfh;
bfh.bfReserved1 = bfh.bfReserved2 = 0;
bfh.bfType = ((WORD)('M'<< 8)|'B');
bfh.bfSize = 54+size;
bfh.bfOffBits = 54; CFile bf;
if(bf.Open("pict.bmp", CFile::modeCreate|CFile::modeWrite))
{
bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData, size);
bf.Close();
nCount++;
}
GlobalFreePtr(lpData);

解决方案 »

  1.   

    CString?位图信息是二进制的,在UNICODE环境下转换为CString会将每个byte变成2个byte,用0填充的,所以肯定不对了。
      

  2.   

    现在我想直接输出CSTring,可是不正确。请问原因。我该怎么改?
    ========
    图像数据用CString输出?这个工作有意义吗?
      

  3.   

    二进制数据有很多0的,而CString是字符串,0表示字符串结束
    你应该给你的lpData做个BASE64编码,然后才能用CString来查看
      

  4.   

    而且用CString也干不了这个啊,字符串都是以0为结束符的,BMP图像里一定会出现很多0,一出现就截断了,你根本没办法用CString来显示啊。
      

  5.   

    是这样的。我现在需要获得屏幕上的(x,y)的颜色值,需要的数量很多,用GetPixel(),速度很慢。想直接读lpData的内容。lpData是char* 的格式我为了方便截取才想用CString,不用也可以。我单步读取*(lpData + i * sizeof(char)),st.Format("%x", *(lpData + i*sizeof(char)));发现是
    "0xffffffe1","68","a9","0",
    "0xffffffe1","68","a9","0",
    "0xffffffe1","68","a9","0",
    "0xffffffe1","68","a9","0",
    "0xffffffe1","68","a9","0",
    "0xffffffe2","6a","28","0",
    "0xffffffe2","6a","28","0",
    "0xffffffe2","6a","28","0",
    "0xffffffe3","6d","3d","0",
    ……
    前面的"0xffffffe3"怎么这么长?
      

  6.   

    lpData的格式是BYTE *,不是char *,
    虽然两个定义差不多,但是意义不一样
      

  7.   

    终于找到了方法。结贴了。
    BYTE ur;
    BYTE ub;
    BYTE ug;
    long ll;
    COLORREF col = 0;
    ll = ((iH - iy - 1) * iW + ix) * 4;
    ur = *(lpData + ll);
    ll++;
    ub = *(lpData + ll);
    ll++;
    ug = *(lpData + ll);
    col = ur<<16;
    col += ub<<8;
    col += ug;
    col 就是结果了。
      

  8.   

    读一读lpDtat 果然每4个数就有一个“00”