我在服务器端定义一个变量:BYTE ImageBuffer[1024*910];
然后通过
m_nCount=bm.GetBitmapBits(1024*910,ImageBuf);//将图像的位信息写入到指定的缓冲中
这样,位图的信息存储在缓冲中。经过中间的消息传送(通过Windows Socket),到达客户端,在客户端已经接收到ImageBuffer[1024*910];
现在我想在客户端显示这个位图,需要怎样操作?
我试着使用CBitmap bm;
         bm.SetBitmapBits(m,ImageBuffer);//m即为要设置位的数目
可是返回值为0,有没有人有现成的例子可供享用?

解决方案 »

  1.   

    BITMAP bm;            //声明bm为BITMAP数据结构
    BITMAP bm1;
    int x,y,i=0;
    GetClientRect(&rect);
    mdc = new CDC;        
    bitmap = new CBitmap;
    bgbmp = new CBitmap;
    mdc->CreateCompatibleDC(dc); //建立与dc兼容的DC
    bgbmp->m_hObject = (HBITMAP)::LoadImage(NULL,"E:/代码集中营/ZSFTest/半透明效果/bground.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); //载入背景图
    bitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"E:/代码集中营/ZSFTest/半透明效果/girl.bmp",IMAGE_BITMAP,298,329,LR_LOADFROMFILE); //载入源位图
    bitmap->GetObject(sizeof(BITMAP),&bm1); //取得 bitmap 位图的信息
    BYTE *px = new BYTE[bm1.bmHeight*bm1.bmWidthBytes]; //声明暂存数组
    bitmap->GetBitmapBits(bm1.bmHeight*bm1.bmWidthBytes,px); //取得源位图各像素点的 RGB 值存入 px 数组中
    for(y=0;y<bm1.bmHeight;y++)
    for(x=0;x<bm1.bmWidth;x++)
    {
    BYTE red,green,blue;
    red=((px[y*bm1.bmWidthBytes+2*x+1]&0xF8)>>3)/2;
    green=(((px[y*bm1.bmWidthBytes+2*x+1]&0x07)<<3)+((px[y*bm1.bmWidthBytes+2*x]&0xE0)>>5))/2;
    blue=(px[y*bm1.bmWidthBytes+2*x]&0x1F)/2; px[y*bm1.bmWidthBytes+2*x]=(green&0x07<<5)+blue;
    px[y*bm1.bmWidthBytes+2*x+1]=(red<<3)+((green&0x38)>>3);
    }
    bgbmp->GetObject(sizeof(BITMAP),&bm); 
    BYTE *px1 = new BYTE[bm.bmHeight*bm.bmWidthBytes];  
    bgbmp->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px1); 
    for(y=100;y<100+bm1.bmHeight;y++)
    for(x=150;x<150+bm1.bmWidth;x++)
    { BYTE red,green,blue;
    red=((px1[y*bm.bmWidthBytes+2*x+1]&0xF8)>>3)/2;
    green=(((px1[y*bm.bmWidthBytes+2*x+1]&0x07)<<3)+((px1[y*bm.bmWidthBytes+2*x]&0xE0)>>5))/2;
    blue=(px1[y*bm.bmWidthBytes+2*x]&0x1F)/2; px1[y*bm.bmWidthBytes+2*x]=(green&0x07<<5)+blue+px[i]; 
    px1[y*bm.bmWidthBytes+2*x+1]=(red<<3)+((green&0x38)>>3)+px[i+1]; i=i+2;
    }
    bgbmp->SetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px1); 
    mdc->SelectObject(bgbmp); 
    delete px;
    delete px1;