怎么得到图像的内容?

baoyz baoyz 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我用下面的代码把桌面保存到文件"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);
...全文

相关推荐

评论 10
收藏 已收藏
分享
返回顶部
baoyz
图形处理/算法 19,463 成员 50,678 内容