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);

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

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

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

    jackyhwei 发布于 2010-01-01 12:02 点击:3218次  来自:CSDN.NET 一些非常有用的图像格式转换及使用的源代码,包括RGB图像数据字符叠加,图像压缩(ijl库),Y ...

  2. 嵌入式开发之字符叠加---gb2313 国标码,utf8 国际码,unicode 无码

    (1)国标码简介 (2)编码转换 (3)时间获取 (4)显示切换 最近做了个字符叠加,包括时间叠加,字符中文叠加,位置移动,等功能开启.因为一般的字符叠加的点阵式16位,然后填充着16位的编码是gb2 ...

  3. sublime text 2中Windows下编写的脚本在Linux平台上运行遇到字符问题

    今天在windows下的sublime text 2下写了个脚本,上传到ubuntu服务器中执行后提示: -bash: /usr/bin/python: /usr/bin/python^M: bad ...

  4. 在python上获得随机字符

    """今天写一个程序,在想既然可以获得随机数,那我可不可以获得任意字符呢,于是在stackoverflow.com 上找到了方法,几乎都是用导入random,然后再用其它 ...

  5. python基础之Day7part2 史上最清晰字符编码理解

    二.字符编码 基础知识: 文本编辑器存取文件原理与py执行原理异同: 存/写:进入文本编辑器 写内容 保存后 内存数据刷到硬盘 取/读:进入文本编辑器 找到内容 从硬盘读到内存 notepad把文件内 ...

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

    模拟生产环境下数据格式,再现异常情景:   Notepad++怎样输入字符[NUL]? 安装 Hex-Editor 插件: HexEditor插件用于在notepad++中查看16进制文件,只需要将此 ...

  7. Java笔记(二十六)……IO流上 字节流与字符流

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  8. 同构体字符串(如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。 所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。)

    示例 1: 输入: s = "egg", t = "add" 输出: true 示例 2: 输入: s = "foo", t = " ...

  9. 地图组件上的自定义区域叠加层显示 ArcGis + GeoJson

    最近参与了一个IOT环境项目,需要对某个城市的某几个区域做环境监控与治理,其中就用到了地图叠加层的功能,粗看很复杂,其实很简单,先来看一下效果,然后再来讲一下如何实现的: 中间的黄色轮廓线包括的几块区 ...

随机推荐

  1. 不使用Math.random实现随机数

    不使用Math.random实现随机数 var rand = (function(){ var today = new Date(); var seed = today.getTime(); func ...

  2. cglib应用

    JDK的动态代理,经常被用来动态地创建对象的代理.JDK的动态代理用起来非常简单,但是有一个限制,就是使用动态代理的对象必须实现一个或多个接口.如果想代理没有实现接口,还可以使用cglib包来完成代理 ...

  3. Python学习/复习神器-->各种方法/技巧在哪用和典型例子(一)

    就我个人在学习Python的过程中,经常会出现学习了新方法后,如果隔上几天不用,就忘了的情况,或者刚学习的更好的方法没有得到应用,还是沿用已有的方法,这样很不利于学习和掌握新姿势,从而拉长学习时间,增 ...

  4. Effective Java 第三版——33. 优先考虑类型安全的异构容器

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  5. 单元测试——Qunit

    为什么需要单元测试 正确性:测试可以验证代码的正确性,在上线前做到心里有底 自动化:当然手工也可以测试,通过console可以打印出内部信息,但是这是一次性的事情,下次测试还需要从头来过,效率不能得到 ...

  6. jsz中的作用域与上下文

    var x=10; function fun() { console.log(x);//10 } function demo(f) { if(f instanceof Function){ fun() ...

  7. Elasticsearch-深入理解索引原理

    最近开始大面积使用ES,很多地方都是知其然不知其所以然,特地翻看了很多资料和大牛的文档,简单汇总一篇.内容多为摘抄,说是深入其实也是一点浅尝辄止的理解.希望大家领会精神. 首先学习要从官方开始地址如下 ...

  8. Yii小部件

    小部件 Yii提供了一套数据小部件widgets,这些小部件可以用于显示数据. DetailView小部件用于显示一条记录数据. ListView和GridView小部件能够用于显示一个拥有分页.排序 ...

  9. Qt msvc Modules

    3D ActiveQt container ActiveQt server Bluetooth Concurrent Core Enginio Declarative Gui Help Locatio ...

  10. mysql 学习心得5

    常用函数 字符串函数 concat(S1,S2....,Sn) 链接s1 s2 ...... 任何字符串和null链接显示为null insert(str,x,y,instr)  将str从x位开始y ...