有什么办法解决图片显示不连续的有关问题
有什么办法解决图片显示不连续的问题
我做了个服务器和客户机,用VFW来捕获视频图片(是位图),
然后客户端连续传输位图到服务器,服务器来显示位图,
可是我发现显示的不连续,常常是两图显示之间显示的是全黑的,
请问:有什么好的解决办法?
//显示位图
int cxDib, cyDib ;
BITMAPINFO * pbmi ;
BYTE * pBits ;
pbmi = (BITMAPINFO *)pBmp;
pBits = (BYTE *) pBmp +40; //位图数据开始的位置
cxDib = pbmi->bmiHeader.biWidth ; //位图的宽度
cyDib = abs(pbmi->bmiHeader.biHeight); //位图的长度
//先把位图画在内存设备上下文上
HDC hdc;
hdc=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
int cx,cy;
cx=cxDib;
cy=cyDib;
//
HDC memhdc;
memhdc=CreateCompatibleDC(hdc);
//创建与窗口句柄兼容的位图
HBITMAP hBitmap,holdBitmap;
hBitmap=CreateCompatibleBitmap(hdc,cx,cy);
holdBitmap=(HBITMAP)SelectObject(memhdc,hBitmap);
SetDIBitsToDevice (memhdc,
0, // xDst
0, // yDst
cxDib, // cxSrc
cyDib, // cySrc
0, // xSrc
0, // ySrc
0, // first scan line
cyDib, // number of scan lines
pBits,
pbmi,
DIB_RGB_COLORS) ;
CWnd *pWndStaic2=GetDlgItem(IDC_STATIC2);
CDC *pDC=pWndStaic2->GetDC();
RECT rect;
pWndStaic2->GetClientRect(&rect);
StretchBlt(pDC->m_hDC,0,0,rect.right,rect.bottom,memhdc,0,0,cx,cy,SRCCOPY);
因为我考虑到服务器的显示器的大小、设置不同,所以不是直接用SetDIBitsToDevice在服务器端显示,
而是先画到内存中,然后在用StretchBlt来拉申显示(服务器端的控件STATIC显示的大小可能与设置有
关,所以用拉申函数),我这个代码应该也是双缓冲区了吧
------解决方案--------------------
不是很懂,给点个人意见。从你描述来说,可能是你网络传输位图太大,要很久才能存满内存,重而触发显示,换种图片格式。有一种图片格式是用来网络传输使用的。它能先显示模糊的图像,然后逐渐清晰,直到完成传输。
我做了个服务器和客户机,用VFW来捕获视频图片(是位图),
然后客户端连续传输位图到服务器,服务器来显示位图,
可是我发现显示的不连续,常常是两图显示之间显示的是全黑的,
请问:有什么好的解决办法?
//显示位图
int cxDib, cyDib ;
BITMAPINFO * pbmi ;
BYTE * pBits ;
pbmi = (BITMAPINFO *)pBmp;
pBits = (BYTE *) pBmp +40; //位图数据开始的位置
cxDib = pbmi->bmiHeader.biWidth ; //位图的宽度
cyDib = abs(pbmi->bmiHeader.biHeight); //位图的长度
//先把位图画在内存设备上下文上
HDC hdc;
hdc=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
int cx,cy;
cx=cxDib;
cy=cyDib;
//
HDC memhdc;
memhdc=CreateCompatibleDC(hdc);
//创建与窗口句柄兼容的位图
HBITMAP hBitmap,holdBitmap;
hBitmap=CreateCompatibleBitmap(hdc,cx,cy);
holdBitmap=(HBITMAP)SelectObject(memhdc,hBitmap);
SetDIBitsToDevice (memhdc,
0, // xDst
0, // yDst
cxDib, // cxSrc
cyDib, // cySrc
0, // xSrc
0, // ySrc
0, // first scan line
cyDib, // number of scan lines
pBits,
pbmi,
DIB_RGB_COLORS) ;
CWnd *pWndStaic2=GetDlgItem(IDC_STATIC2);
CDC *pDC=pWndStaic2->GetDC();
RECT rect;
pWndStaic2->GetClientRect(&rect);
StretchBlt(pDC->m_hDC,0,0,rect.right,rect.bottom,memhdc,0,0,cx,cy,SRCCOPY);
因为我考虑到服务器的显示器的大小、设置不同,所以不是直接用SetDIBitsToDevice在服务器端显示,
而是先画到内存中,然后在用StretchBlt来拉申显示(服务器端的控件STATIC显示的大小可能与设置有
关,所以用拉申函数),我这个代码应该也是双缓冲区了吧
------解决方案--------------------
不是很懂,给点个人意见。从你描述来说,可能是你网络传输位图太大,要很久才能存满内存,重而触发显示,换种图片格式。有一种图片格式是用来网络传输使用的。它能先显示模糊的图像,然后逐渐清晰,直到完成传输。