这是我写了一半的代码 功能是把传过来的一帧图像bob处理一下然后显示 
之前的显示是用BitBlt,StretchBlt发现完全错了,只是把视频源给复制了一遍 根本没有处理效果
我想找一种把处理后的图像HBITMAP文件显示到指定位置去, 多谢了BYTE *pData;
long samplesize;
    samplesize=pSample->GetActualDataLength();
pSample->GetPointer(&pData);
  for(int j=1;j<=240;j=j+2)//bob_deinterlace
  { for(int i=0;i<320;i++)   
           *(pData+i+320*j)=*(pData+i);  }
   
    
 long nDataSize = 320*240*3; int iPixel = 32;            //RGB24
BITMAPINFOHEADER bmih; //Information header
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth =320; //Image width
bmih.biHeight = 240; //Image height
bmih.biPlanes = 1;
bmih.biBitCount = iPixel; //RGB24
bmih.biCompression = BI_RGB;
bmih.biSizeImage = 0;       //Uncompressed RGB bitmaps
bmih.biXPelsPerMeter = 0;
bmih.biYPelsPerMeter = 0;
bmih.biClrUsed = 0;
bmih.biClrImportant = 0;    BITMAPINFO bmif; 
       
  
      
    HBITMAP hdps=CreateDIBitmap(m_pDisplaydc,&bmih,CBM_INIT,pData,&bmif,DIB_RGB_COLORS);
就到这里不会写了

解决方案 »

  1.   


    CClientDC dcTest(this);
    CDC memDC;
    memDC.CreateCompatibleDC(&dcTest);
    memDC.SelectObject(hb);
    dcTest.BitBlt(x,y,w,h,&memDC,xsrc,ysrc);
      

  2.   

    BitBlt, StretchBlt, DrawDib...都可以
      

  3.   


    对的,我一般用 StretchBlt
      

  4.   

    for(int j=1;j<=240;j=j+2)//bob_deinterlace
          { for(int i=0;i<320;i++)   
                   *(pData+i+320*j)=*(pData+i);     }这句*(pData+i+320*j)=*(pData+i);是什么意思?
    这样图像不是每行都是同样的数据了吗?第二个for 320不乘3吗?是单色的?int iPixel = 32; 这一行不应该是 24?假如说你上述处理都是对的,pData指向了320*240*3大小的数据。
    把这行改成 bmih.biSizeImage = 320*240*3;然后就可以用::SetDIBitsToDevice()显示了。
      

  5.   

    完全同意5楼,类似于这样void CAnyClr::SetClr(COLORREF color)
    {
            ULONG i,j;
    ULONG lLineBytes;
    lLineBytes = (GetWidth()*3*8+31)/32*4;
    if(BitMap==NULL) return ;
    for(i=0;i<GetHeight();i++)
    for(j=0;j<GetWidth();j++)
    {
    pImage[i*lLineBytes+j*3]  =GetBValue(color); //兰绿红顺序
    pImage[i*lLineBytes+j*3+1]=GetGValue(color);
    pImage[i*lLineBytes+j*3+2]=GetRValue(color);
    }
        BcColor = color;  //存颜色
    }
    以上代码看懂自然就会了
      

  6.   

    只要改变下面坐标就可以了
    mDC.BitBlt(left.x,left.y,GetWidth(),GetHeight(),&dcMem,0,0,SRCCOPY);
      

  7.   


    5楼的兄弟 多谢了 这句*(pData+i+320*j)=*(pData+i);是什么意思?
    这句话是一个bob处理方法,用你的方法的确可显示 但是图像的大小位置 不理想,能不能解释下 各个参数的意思。下面是我用这组参数的结果,SetDIBitsToDevice(m_image,0,0,500,500,0,200,0,400,pData,&bmif,DIB_RGB_COLORS) ;
    m_image是右边那个Pictrue control的HDC
      

  8.   

    这各个参数你照MSDN做就可以了,具体哪个我也记不住。
    ::SetStretchBltMode();
    ::StretchDIBits()
    或者这样控制大小缩放