DirectX--yuv420p上实现的字符叠加

unsigned char *pTemp;
BYTE OsdY = 0;
BYTE OsdU = 0;
BYTE OsdV = 0;

void OSDSetTextColor(BYTE OsdR, BYTE OsdG, BYTE OsdB)
{
OsdY = 0.25*OsdR+0.504*OsdG+0.098*OsdB+16;
OsdU = -0.148*OsdR-0.291*OsdG+0.439*OsdB+128;
OsdV = 0.439*OsdR-0.368*OsdG-0.071*OsdB+128;
}
void CTest0Dlg::setOSD()
{
FILE *fp=fopen("d:\\temp\\OSD.bmp", "rb");
if(fp == 0)
return ;
HDC hDC = ::GetDC(GetSafeHwnd());
HDC hMemDC = CreateCompatibleDC(hDC);
fseek(fp, sizeof(BITMAPFILEHEADER), 0);
BITMAPINFOHEADER head;
fread(&head, sizeof(BITMAPINFOHEADER), 1, fp);
int bmpHeight = head.biHeight;
int bmpWidth = head.biWidth;
int biBitCount = head.biBitCount;
int lineByte = (bmpWidth*biBitCount/8+3)/4*4;
RGBQUAD *pColorTable;
unsigned char *pBmpBuf = new unsigned char[lineByte*bmpHeight];
fread(pBmpBuf, 1, lineByte*bmpHeight, fp);
memset(pBmpBuf,0, lineByte*bmpHeight);

CDC *m_pMemDC;
m_pMemDC = new CDC();
CDC *pDC;
pDC = GetDC();
m_pMemDC->CreateCompatibleDC(pDC);
CBitmap *m_pOldBmp = NULL;
CBitmap *m_pMemBmp = new CBitmap();       //根据图片的大小创建一个兼容位图
m_pMemBmp->CreateCompatibleBitmap(pDC, bmpWidth, bmpHeight);
m_pOldBmp = m_pMemDC->SelectObject(m_pMemBmp);

// 把图像的数据绘制到兼容位图上
 
SetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject, 
0, bmpHeight, (LPVOID)pBmpBuf, (BITMAPINFO*)&head, DIB_RGB_COLORS);
m_pMemDC->SetBkMode(TRANSPARENT);
m_pMemDC->SetTextColor(RGB(255, 0, 0));//RGB标记色
OSDSetTextColor(0, 0, 0);//OSD显示色

//设置字体
CFont font;
font.CreateFont(20,15,0,0,10,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,"宋体");
SelectObject(hMemDC, font); 
///////////////////////////
SYSTEMTIME st;
CString strDate,strTime;
GetLocalTime(&st);
strDate.Format("时间 %04d-%02d-%02d ",st.wYear,st.wMonth,st.wDay);
strTime.Format("%02d:%02d:%02d",st.wHour,st.wMinute,st.wSecond);
// 添加文字到指定位置
m_pMemDC->TextOut(20, 40, strDate+strTime);

pTemp = new unsigned char[lineByte*bmpHeight];
GetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject, 0, bmpHeight, 
(LPVOID)pTemp, (BITMAPINFO*)&head, DIB_RGB_COLORS);
fclose(fp);

delete m_pMemBmp;
delete m_pMemDC;
delete[] pBmpBuf;

//MessageBox("VOER!");
}

调用部分

//////////////////////////////////////////////////////////////////////////////////////
setOSD();
for (int i=0;i<80;i++)
{
for (int k=0;k<640;k++)
{
//dc.SetPixel(k,79-i,RGB(pTemp[(i*640+k)*3+2],pTemp[(i*640+k)*3+1],pTemp[(i*640+k)*3+0]));
if (pTemp[(i*640+k)*3+2]!=0)//需要叠加  通过标记色过滤
{
pFrameYUV->data[0][(79-i)*720+k]=OsdY;
if((79-i)%2==0)
{
pFrameYUV->data[1][(79-i)*720/4+k/2]=OsdU;
pFrameYUV->data[2][(79-i)*720/4+k/2]=OsdV;
}

}
}
}
/////////////////////////////////////////////////////////////////////////////////////////
  memcpy(image->pixels[0], pFrameYUV->data[0],720*576);//拷贝数据yuv420,也可预先改变指针
  memcpy(image->pixels[2], pFrameYUV->data[1],720*576/4);
  memcpy(image->pixels[1], pFrameYUV->data[2],720*576/4);

。。。。。。。。。。。。。。。。。。。。。。。。。

时间: 2014-12-17

DirectX--yuv420p上实现的字符叠加的相关文章

(DirectX系列06)DirectShow 字符叠加Filter编码分析

(DirectX系列06)DirectShow 字符叠加Filter编码分析 在很多视频播放的软件当中,字幕的处理是免不了的,有些可能本身已经加载到图像当中未做处理,但大部分都是通过字符叠加来进行处理的.DirectShow 的字符叠加Filter在这些软件中都扮演这绝佳的作用.这一节来介绍DirectShow字符叠加Filter编码的实现,如下详细介绍: 这个Filter的大概作用是在视频流指定的一段时间内进行字符叠加,字符字体.大小.颜色都进行控制,普遍支持RGB 的各种编码格式,同时实现字

RGB图像数据字符叠加,图像压缩(ijl库),YUV转RGB

jackyhwei 发布于 2010-01-01 12:02 点击:3218次  来自:CSDN.NET 一些非常有用的图像格式转换及使用的源代码,包括RGB图像数据字符叠加,图像压缩(ijl库),YUV转RGB等等. TAG: YUV  YUV转RGB  RGB  BMP转JPG  文字叠加     /**************************************File: yuvrgb24.hDescription: header file for yuvrgb24.cDate

moxa 字符叠加-moxa相机字符叠加时候创建画笔和画刷对象失败

问题描述 moxa相机字符叠加时候创建画笔和画刷对象失败 工作上面最近需要用到moxa相机,在做字符叠加时候,创建画笔和画刷对象失败 解决方案 创建画笔.画刷 解决方案二: http://wenku.baidu.com/link?url=01uGN1JlzAl71Xfbr7cQl0e9LqyhjLugcSzNFkbsnAZUiKuZWZVnB7YDantItMuGjp22TjDIIqbbcfqUxVmePuAPzbQlRlOWJFqHpg8V_gS

用owc11控件在winform上画柱状图,怎么在同一个柱上显示不同的叠加(给出我所有的分100)

问题描述 我用owc11控件在winform上画柱状图,但是我不知道怎么在同一个柱上显示不同的叠加,意思是我需要不同的数值,显示在同一柱子上但是用不同的颜色区分.例如,a=10,b=20.我希望有一根柱子显示这两个值,下面是10,上面是20,总值30,10和20用不同颜色表示,但是在同一柱子上.有没有人能给个例子.我用的是vb2005.在线等.我的邮箱ivan0125@gmail.com 解决方案 解决方案二:有没有人能帮帮忙啊解决方案三:该回复于2007-10-18 08:49:05被版主删除

关于GStreamer的一个牛X网页(字符叠加,画中画,屏墙)

在网上闲逛搜GST,不小心发现了一个网址 http://wiki.oz9aec.net/index.php/Gstreamer_cheat_sheet 是WIKI的GStreamer小抄,应该是这样翻译吧. 看了这个网址我就笑了. 上面讲了gstreamer字符叠加,画中画,屏墙等的实现,附带实现的命令,这样实现源码就小case了.

Tunnel上传遇到字符[NUL]问题

模拟生产环境下数据格式,再现异常情景: Notepad++怎样输入字符[NUL]? 安装 Hex-Editor 插件: HexEditor插件用于在notepad++中查看16进制文件,只需要将此dll放入notepad++安装目录下plugins文件夹下,重启notepad++即可.  使用方法: 可以切换到Hex模式,输入00,再切换回来. (使用notepad++打开16进制文件,然后单击菜单栏的'H'按钮,即可转换,如果想转回来,再按一次'H'按钮) 问题描述: 在文本文件中,有时候会包

Graphics上画图形颜色叠加问题

问题描述 我在picturebox的graphics上先用FillRectangle填充一个绿色背景,然后再用FillRectangle填充其他颜色和空白处直接用FillRectangle填充颜色得到的不一样,请看下图.这张图是背景,左侧是绿色背景,右侧是透明背景左侧半边是在绿色背景上填充颜色后的效果,右侧半边是在透明背景上填充颜色后的效果.还有就是bitmap怎么就只是支持"宋体",其他字体都不支持? 解决方案 解决方案二:你用什么方法画的渐变,如果有透明度存在,底色就会干扰实际颜色

在java中如何获取在画布加载的图像上用鼠标点击的字符(图像上有很多字符)

问题描述 例如,我把一个小地图图像加载在canvas画布上,我鼠标点击小地图图像,怎么获取鼠标点击的地点(比如我点击的是火车站),java怎么知道我点的就是火车站,而不是其他地点的 解决方案 解决方案二:思路,给画布加入鼠标监听器addMouseListener,addMouseMotionListener,监听方法里event.getPoint()返回鼠标位置你的火车站,最起码要保留x,ywidthheight4个数据,可以建成Rectangle或其它形状(Shape的子类)Rectangle

在YUV图像上根据背景色实现OSD反色

所谓的OSD其实就是在视频图像上叠加一些字符信息,比如时间,地点,通道号等, 在图像上叠加OSD通常有两种方式: 一种是在前端嵌入式设备上,在图像数据上叠加OSD, 这样客户端这边只需解码显示数据即可.另一种是PC客户端在接收到前端设备图像,解码之后,进行叠加.这两种都是比较常见的方式. OSD具有字符型(Font-Based)和位图型(Bit-Map)两种类型. 字符型OSD:为了节约显示缓存,早期及低成本的解决方案中使用字符型OSD发生器,其原理是将OSD中显示内容按照特定的格式(12×18