我用下面的代码把桌面保存到文件"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);
现在我想直接输出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);
解决方案 »
- 【请教】关于Ethernet II的问题...
- 如何等等WinExec调用程序结束.才继续执行
- 关于网络编程接收到数据后字符串操作
- edit 与richedit处理message时候的不同
- 有没有钩子的例子是基本标准 C++ 的,现在网上都是MFC~!求 C++的
- 奇怪的刷新问题?当动态创建一个(CStatic)后,并响应起它的OnSize()函数,在其执行程序中
- 位图中怎样识别圆?急急急,加急!!
- StretchBlt出来的图象怎么是反的啊
- 高分救急!!!
- 我下载了一个语言为English的VC源码,在改为简体中文后,一些汉字乱码显示,如何纠正!(一定给分)
- 基于window的播放器的界面开发
- 关于如何读取COM接口数据,谢谢大家
========
图像数据用CString输出?这个工作有意义吗?
你应该给你的lpData做个BASE64编码,然后才能用CString来查看
"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"怎么这么长?
虽然两个定义差不多,但是意义不一样
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 就是结果了。