高分求助MFC图像处理方面的程序

ochonglangzheo 2013-12-02 04:23:00
我在实现一个截图并显示的demo,客服端负责截图,然后通过网络发送到服务端,类似于视频监控,现在的问题是:我在服务端要用mfc把从socket中接收的每一帧图片显示出来,不懂mfc,在哪里添加socket通信的代码,怎么通知对话框更新当前显示的图片,看了一天mfc,头都大了,求助,我q563500423
...全文
226 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
5t4rk 2013-12-02
  • 打赏
  • 举报
回复
API 示例
#include<windows.h>  
  
HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE  hPal,DWORD * sizeimage) ;  
BOOL CapScreen(LPTSTR FileName);//截屏函数  
  
HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE  hPal,DWORD * sizeimage)   
{  
    BITMAP              bm;  
    BITMAPINFOHEADER    bi;  
    LPBITMAPINFOHEADER     lpbi;  
    DWORD             dwLen;  
    HANDLE            hDib;  
    HANDLE            handle;  
    HDC               hdc;  
  
    //不支持BI_BITFIELDS类型  
    if( dwCompression == BI_BITFIELDS )  
        return NULL;  
  
    //如果调色板为空,则用默认调色板  
    if (hPal==NULL)  
        hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE );  
  
    //获取位图信息  
    GetObject(bitmap,sizeof(bm),(LPSTR)&bm);  
  
    //初始化位图信息头  
    bi.biSize        = sizeof(BITMAPINFOHEADER);  
    bi.biWidth        = bm.bmWidth;  
    bi.biHeight         = bm.bmHeight;  
    bi.biPlanes         = 1;  
    bi.biBitCount        = bm.bmPlanes * bm.bmBitsPixel;  
    bi.biCompression    = dwCompression;  
    bi.biSizeImage        = 0;  
    bi.biXPelsPerMeter    = 0;  
    bi.biYPelsPerMeter    = 0;  
    bi.biClrUsed        = 0;  
    bi.biClrImportant    = 0;  
  
    //计算信息头及颜色表大小  
    int ncolors = (1 << bi.biBitCount); if( ncolors> 256 )   
        ncolors = 0;  
    dwLen  = bi.biSize + ncolors * sizeof(RGBQUAD);  
  
    // we need a device context to get the dib from  
    hdc = GetDC(NULL);  
    hPal = SelectPalette(hdc,hPal,FALSE);  
    RealizePalette(hdc);  
  
    //为信息头及颜色表分配内存  
    hDib = GlobalAlloc(GMEM_FIXED,dwLen);  
  
    if (!hDib){  
        SelectPalette(hdc,hPal,FALSE);  
        ReleaseDC(NULL,hdc);  
        return NULL;  
    }  
  
    lpbi = (LPBITMAPINFOHEADER)hDib;  
    *lpbi = bi;  
    //调用 GetDIBits 计算图像大小  
    GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight,  
            (LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS );  
  
    bi = *lpbi;  
    //图像的每一行都对齐(32bit)边界  
    if (bi.biSizeImage == 0){  
        bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)   
                        * bi.biHeight;  
    if (dwCompression != BI_RGB)  
            bi.biSizeImage = (bi.biSizeImage * 3) / 2;  
    }  
  
    //重新分配内存大小,以便放下所有数据  
    dwLen += bi.biSizeImage;  
    if (handle = GlobalReAlloc(hDib, dwLen, GMEM_MOVEABLE))  
        hDib = handle;  
    else{  
        GlobalFree(hDib);  
  
        //重选原始调色板  
        SelectPalette(hdc,hPal,FALSE);  
        ReleaseDC(NULL,hdc);  
        return NULL;  
    }  
  
    //获取位图数据  
    lpbi = (LPBITMAPINFOHEADER)hDib;  
  
    //最终获得的DIB  
    BOOL bgotbits = GetDIBits( hdc, bitmap,  
                  0L,                      //扫描行起始处  
                (DWORD)bi.biHeight,      //扫描行数  
                (LPBYTE)lpbi             //位图数据地址  
                + (bi.biSize + ncolors * sizeof(RGBQUAD)),  
                (LPBITMAPINFO)lpbi,      //位图信息地址  
                (DWORD)DIB_RGB_COLORS);  //颜色板使用RGB  
  
    if( !bgotbits )  
    {  
        GlobalFree(hDib);  
          
        SelectPalette(hdc,hPal,FALSE);  
        ReleaseDC(NULL,hdc);  
        return NULL;  
    }  
  
    SelectPalette(hdc,hPal,FALSE);  
    ReleaseDC(NULL,hdc);  
    *sizeimage=bi.biSizeImage;  
    return hDib;  
}   
  
BOOL CapScreen(LPTSTR FileName)  
{  
    DWORD sizeimage;  
    HDC hdc = CreateDC("SHOWSCREEN", NULL, NULL, NULL);   
    HDC CompatibleHDC = CreateCompatibleDC(hdc);   
    HBITMAP BmpScreen = CreateCompatibleBitmap(hdc,GetDeviceCaps(hdc, HORZRES),GetDeviceCaps(hdc, VERTRES));   
    SelectObject(CompatibleHDC, BmpScreen);  
    BitBlt(CompatibleHDC,0,0,GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES),hdc,0,0,SRCCOPY);  
      
HANDLE  pbitmapwithoutfileh=DDBtoDIB(BmpScreen, BI_RGB,0,&sizeimage);  
    BITMAPFILEHEADER bfh;  
   //设置位图信息头结构  
    bfh.bfType = ((WORD)('M'<< 8)|'B');  
    bfh.bfReserved1 = 0;  
    bfh.bfReserved2 = 0;  
    bfh.bfSize = 54+sizeimage;  
    bfh.bfOffBits = 54;  
    //创建位图文件      
HANDLE  hFile=CreateFile(FileName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);  
DWORD dwWrite;  
// 写入位图文件头  
WriteFile(hFile,&bfh,sizeof(BITMAPFILEHEADER),&dwWrite,NULL);  
// 写入位图文件其余内容  
WriteFile(hFile,pbitmapwithoutfileh,bfh.bfSize,&dwWrite,NULL);    
DeleteDC(hdc);  
     
CloseHandle(CompatibleHDC);  
return true;  
}  
  
int main(void)  
{  
CapScreen("d:\\SnapScreen.bmp");  
return 0;  
}
5t4rk 2013-12-02
  • 打赏
  • 举报
回复
MFC刚上手,你就做这个。框架就够你喝一壶的。 你还是控制台吧。或者API DELPHI示例

function TfrmScreen.CaptureScreen(AFileName:String;pressvalue: integer):string;
var
VBmp: TBitmap;
MyJPEG:TJPEGImage;
begin
VBmp := TBitmap.Create;
try
VBmp.Width := Screen.Width;
VBmp.Height := Screen.Height;
BitBlt(VBmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(0), 0,0, SRCCOPY);
MyJPEG:=TJPEGImage.Create;
MyJPEG.Assign(VBmp);
MyJPEG.CompressionQuality:=pressvalue;
MyJPEG.Compress;

MyJPEG.SaveToFile('images\\'+inttostr(iName)+AFileName);
mmoInfo.Lines.Add('images: '+inttostr(iName)+AFileName+' saved');
imgeShow.Picture.LoadFromFile('images\\'+inttostr(iName)+AFileName);

//Sleep(500);
finally
MyJPEG.Free;
VBmp.Free;
end;
end;

procedure TfrmScreen.FormCreate(Sender: TObject);
begin
iName:=1;
end;

procedure TfrmScreen.tmr1Timer(Sender: TObject);
begin
//调用格式:CaptureScreen(文件名称,压缩比例(数值越大约清晰))
Inc(iName);
CaptureScreen('00.jpg',300);
end;

procedure TfrmScreen.N1Click(Sender: TObject);
begin
      tmr1.Enabled:=True;
      frmScreen.Text:='开始屏幕观察';
end;

procedure TfrmScreen.N2Click(Sender: TObject);
begin
      tmr1.Enabled:=False;
       frmScreen.Text:='暂停屏幕观察';
end;
xiao14116 2013-12-02
  • 打赏
  • 举报
回复
这个有现成的源码,随便找个远程控制的源码提取出来就可以了
worldy 2013-12-02
  • 打赏
  • 举报
回复
不懂mfc,用api咯,条条大路通罗马
副组长 2013-12-02
  • 打赏
  • 举报
回复
哪儿都行啊。SOCKET还是CSocket什么的? 服务端已经收到了还是两头都没写呢?这个怎么说呢,问得有点笼统。
ochonglangzheo 2013-12-02
  • 打赏
  • 举报
回复
引用 1 楼 happyparrot 的回复:
看一天你就想学会MFC啊...... 就算给你讲一天,你也是不会的...... 房子不是一天就造成的,要耐心的花时间,按步骤学习,才能盖高楼。
额,虚心接受批评,boss要求周三给他演示下,我才出此下策,大神能给指点下吗,socket通信代码加哪,如果通知加载新的图片
快乐鹦鹉 2013-12-02
  • 打赏
  • 举报
回复
看一天你就想学会MFC啊...... 就算给你讲一天,你也是不会的...... 房子不是一天就造成的,要耐心的花时间,按步骤学习,才能盖高楼。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧