【这篇文章我找了好久啊。。。。用RGB像素画图!!!!!!!!!!!!!!!】使用SetDIBitsToDevice显示RGB数组


http://hi.baidu.com/andorid/blog/item/b6496903080553723812bb0d.html 

这个问题,当时浪费我不少时间,刚开始我是用SetPixel一个像素点一个像素点的描,速度可想而知,特别是在德赛M9的winmobile(400MHZ的CPU,64M内存)上,慢到1FPS,无法接受。当时还没意识到是SETPIXEL的问题,还以为是XVID解码太慢的问题,然后写了个LOG,发现速度瓶颈在SETPIXEL。于是查了些资料,说DirectShow速度很快,我便想用DIRECTSHOW,不过这个有些难,一时半会我也搞不懂,后来放弃了,后来偶然找到了些资料,发现可以直接在"设备"上显示RGB数组,即用SetDIBitsToDevice这个API,贴上我的代码来,这个API终于解决了那个问题

void CClientDlg::PostDecHandler(unsigned char *picbuffer, int used_bytes, int channel)
{

static long frame_count = 0;
static long time_start = 0;
static long video_total = 0;
static long time_total = 0;
static bool firstframe = true;
if (firstframe == true)
{
   firstframe = false;
   time_start = GetTickCount();
}
video_total += used_bytes;
BITMAPINFO bmi;   
ZeroMemory(&bmi,   sizeof(BITMAPINFO));   
bmi.bmiHeader.biSize   =   sizeof(BITMAPINFOHEADER);   
bmi.bmiHeader.biWidth   =   m_Width[channel];   
bmi.bmiHeader.biHeight   = m_Height[channel]; //当图像是倒立显示的时候,把biHeight改为对应的负值
bmi.bmiHeader.biPlanes   =   1;   
bmi.bmiHeader.biBitCount   =   24;   
bmi.bmiHeader.biCompression   =   BI_RGB; 
   SetDIBitsToDevice(cur_dc[channel]->m_hDC, m_nLeft[channel],m_nTop[channel],m_Width[channel],m_Height[channel],0,0,0,m_Height[channel],picbuffer,&bmi,DIB_RGB_COLORS);

if (++frame_count%int(m_fFps[channel]) == 0)//显示比特率和帧率
{
   time_total = GetTickCount()-time_start;
   time_start = GetTickCount();
   m_fRealFps[channel] = m_fFps[channel]*1000/time_total;
   m_nRealSpeed[channel] =((video_total/1024.0)/(time_total/1000.0))*8;
   CString info;
   info.Format("%.1f FPS",m_fRealFps[channel]);
   GetDlgItem(IDC_EDIT_FRAMERATE)->SetWindowText(info);
   info.Format("%.1f Kbit/s",m_nRealSpeed[channel]);
   GetDlgItem(IDC_EDIT_SPEED)->SetWindowText(info);
   video_total = 0;
   time_total = 0;

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值