如何利用SOCKET传输BMP图片
//获得BMP图象的位图信息头和数据内容,可以用DrawDib对BMP图象进行图形绘制显示。
想要问的是在接收lpData数据时候是写入char缓冲,要用什么格式读出并用DrawDib绘制显示?
最好详细说下传输时候lpData格式转换。
void senddata(HWND hWnd,SOCKET vsocket)
{
HWND farhwnd = hWnd;
SOCKET socket = vsocket;
static isDrawDibOpen = false;
HDRAWDIB hDibDC = NULL;
HDC hDibDC2 = GetDC(farhwnd);
CRect rect(570,300,810,490);
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
int Width=GetSystemMetrics(SM_CXSCREEN);
int Height=GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap*pOld=tdc.SelectObject(&bm);
// tdc.BitBlt(0,0,rect.Width()/2,rect.Height()/2,&dc,rect.left,rect.top,SRCCOPY);
tdc.StretchBlt(0,0,rect.Width(),rect.Height(),&dc,
rect.left,rect.top,rect.Width(),rect.Height(),SRCCOPY);
tdc.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
LPSTR lpData=(LPSTR)GlobalAlloc(GPTR,size);
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);
//bm.GetBitmapBits(size,lpData);//此函数在处理5-5-5模式的16位色下会出现颜色混乱
send(socket,lpData,size,0);
}
问题点数:0、回复次数:2Top
1 楼yyltt()回复于 2005-06-01 02:39:29 得分 0
还有就是客户端对CDC dc和CBitmap bm等环境初始化和服务器是一样的,只不过服务器通过SOCKET把lpData传到客户端进行图形绘制显示。不知道这种思路对不对?Top
2 楼laiyiling(陌生人[MVP])回复于 2005-06-01 07:22:27 得分 0
http://www.vckbase.com/document/viewdoc/?id=639
例子中有抓屏幕位图传输的功能,参考一下.Top




