这是我写了一半的代码 功能是把传过来的一帧图像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);
就到这里不会写了
之前的显示是用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);
就到这里不会写了
CClientDC dcTest(this);
CDC memDC;
memDC.CreateCompatibleDC(&dcTest);
memDC.SelectObject(hb);
dcTest.BitBlt(x,y,w,h,&memDC,xsrc,ysrc);
对的,我一般用 StretchBlt
{ 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()显示了。
{
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; //存颜色
}
以上代码看懂自然就会了
mDC.BitBlt(left.x,left.y,GetWidth(),GetHeight(),&dcMem,0,0,SRCCOPY);
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
::SetStretchBltMode();
::StretchDIBits()
或者这样控制大小缩放