怎么得到图像的内容?

baoyz 2011-06-23 03:16:21
我用下面的代码把桌面保存到文件"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);
...全文
69 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
baoyz 2011-06-24
读一读lpDtat 果然每4个数就有一个“00”
  • 打赏
  • 举报
回复
baoyz 2011-06-24
终于找到了方法。结贴了。
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 就是结果了。
  • 打赏
  • 举报
回复
shenyi0106 2011-06-23
lpData的格式是BYTE *,不是char *,
虽然两个定义差不多,但是意义不一样
  • 打赏
  • 举报
回复
baoyz 2011-06-23
是这样的。我现在需要获得屏幕上的(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"怎么这么长?
  • 打赏
  • 举报
回复
wltg2001 2011-06-23
[Quote=引用 5 楼 shenyi0106 的回复:]
引用 2 楼 wltg2001 的回复:
现在我想直接输出CSTring,可是不正确。请问原因。我该怎么改?
========
图像数据用CString输出?这个工作有意义吗?

如果仅仅是为了显示一下的话,确实没有那个意义
[/Quote]
而且用CString也干不了这个啊,字符串都是以0为结束符的,BMP图像里一定会出现很多0,一出现就截断了,你根本没办法用CString来显示啊。
  • 打赏
  • 举报
回复
shenyi0106 2011-06-23
[Quote=引用 2 楼 wltg2001 的回复:]
现在我想直接输出CSTring,可是不正确。请问原因。我该怎么改?
========
图像数据用CString输出?这个工作有意义吗?
[/Quote]
如果仅仅是为了显示一下的话,确实没有那个意义
  • 打赏
  • 举报
回复
shenyi0106 2011-06-23
二进制数据有很多0的,而CString是字符串,0表示字符串结束
你应该给你的lpData做个BASE64编码,然后才能用CString来查看
  • 打赏
  • 举报
回复
fandh 2011-06-23
AfxMessageBox(st);
  • 打赏
  • 举报
回复
wltg2001 2011-06-23
现在我想直接输出CSTring,可是不正确。请问原因。我该怎么改?
========
图像数据用CString输出?这个工作有意义吗?
  • 打赏
  • 举报
回复
kyotrue 2011-06-23
CString?位图信息是二进制的,在UNICODE环境下转换为CString会将每个byte变成2个byte,用0填充的,所以肯定不对了。
  • 打赏
  • 举报
回复
相关推荐
发帖
图形处理/算法

1.9w+

社区成员

VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
帖子事件
创建了帖子
2011-06-23 03:16
社区公告
暂无公告