求一个显示内存图像的方法

caoatcao 2011-03-09 05:26:20
这是我写了一半的代码 功能是把传过来的一帧图像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);


就到这里不会写了
...全文
134 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
副组长 2011-03-11
  • 打赏
  • 举报
回复
这各个参数你照MSDN做就可以了,具体哪个我也记不住。
::SetStretchBltMode();
::StretchDIBits()
或者这样控制大小缩放
caoatcao 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gordon3000 的回复:]

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 ……
[/Quote]

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


无水先生 2011-03-10
  • 打赏
  • 举报
回复
只要改变下面坐标就可以了
mDC.BitBlt(left.x,left.y,GetWidth(),GetHeight(),&dcMem,0,0,SRCCOPY);
无水先生 2011-03-10
  • 打赏
  • 举报
回复
完全同意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; //存颜色
}
以上代码看懂自然就会了
副组长 2011-03-10
  • 打赏
  • 举报
回复
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()显示了。
TandyT 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jwybobo2007 的回复:]
BitBlt, StretchBlt, DrawDib...都可以
[/Quote]

对的,我一般用 StretchBlt
jwybobo2007 2011-03-09
  • 打赏
  • 举报
回复
BitBlt, StretchBlt, DrawDib...都可以
lovev8 2011-03-09
  • 打赏
  • 举报
回复

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

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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