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);
。。。。。。。。。。。。。。。。。。。。。。。。。
DirectX--yuv420p上实现的字符叠加的更多相关文章
- RGB图像数据字符叠加,图像压缩(ijl库),YUV转RGB
jackyhwei 发布于 2010-01-01 12:02 点击:3218次 来自:CSDN.NET 一些非常有用的图像格式转换及使用的源代码,包括RGB图像数据字符叠加,图像压缩(ijl库),Y ...
- 嵌入式开发之字符叠加---gb2313 国标码,utf8 国际码,unicode 无码
(1)国标码简介 (2)编码转换 (3)时间获取 (4)显示切换 最近做了个字符叠加,包括时间叠加,字符中文叠加,位置移动,等功能开启.因为一般的字符叠加的点阵式16位,然后填充着16位的编码是gb2 ...
- sublime text 2中Windows下编写的脚本在Linux平台上运行遇到字符问题
今天在windows下的sublime text 2下写了个脚本,上传到ubuntu服务器中执行后提示: -bash: /usr/bin/python: /usr/bin/python^M: bad ...
- 在python上获得随机字符
"""今天写一个程序,在想既然可以获得随机数,那我可不可以获得任意字符呢,于是在stackoverflow.com 上找到了方法,几乎都是用导入random,然后再用其它 ...
- python基础之Day7part2 史上最清晰字符编码理解
二.字符编码 基础知识: 文本编辑器存取文件原理与py执行原理异同: 存/写:进入文本编辑器 写内容 保存后 内存数据刷到硬盘 取/读:进入文本编辑器 找到内容 从硬盘读到内存 notepad把文件内 ...
- Tunnel上传遇到字符[NUL]问题
模拟生产环境下数据格式,再现异常情景: Notepad++怎样输入字符[NUL]? 安装 Hex-Editor 插件: HexEditor插件用于在notepad++中查看16进制文件,只需要将此 ...
- Java笔记(二十六)……IO流上 字节流与字符流
概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...
- 同构体字符串(如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。 所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。)
示例 1: 输入: s = "egg", t = "add" 输出: true 示例 2: 输入: s = "foo", t = " ...
- 地图组件上的自定义区域叠加层显示 ArcGis + GeoJson
最近参与了一个IOT环境项目,需要对某个城市的某几个区域做环境监控与治理,其中就用到了地图叠加层的功能,粗看很复杂,其实很简单,先来看一下效果,然后再来讲一下如何实现的: 中间的黄色轮廓线包括的几块区 ...
随机推荐
- ASP.NET MVC 5 ABP DataTables (一)
1)ABP DataTables 应用(一) 2) ABP DataTables 应用(二) JS DataTables 这个组件绑定数据必须要有自己的返回数据格式.但是ABP返回的格式直接绑定是错 ...
- BZOJ 2743: [HEOI2012]采花 [树状数组 | 主席树]
题意: 查询区间中出现次数$>2$的颜色个数 一眼主席树,区间中$l \le last[i] \le r$的个数减去$l \le last[last[i]] \le r$的个数,搞两颗主席树来做 ...
- 新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD Application Key
新版Azure Automation Account 浅析(三) --- 用Runbook管理AAD应用的Key 前篇讲过有一个面向公众的Runbook库,社区和微软一直往其中加入新的Runbook, ...
- shared_lock and unique_lock
简单的说: shared_lock是read lock.被锁后仍允许其他线程执行同样被shared_lock的代码.这是一般做读操作时的需要. unique_lock是write lock.被锁后不允 ...
- MySQL 存储过程的简单使用
首先创建一张 students 表 SQL脚本如下: create table students( id int primary key auto_increment, age int, name v ...
- 【Tools】Pycharm2017 windows安装与修改中文界面教程
[windows] 1.到官网下载Pycharm最新版 https://www.jetbrains.com/pycharm/download/#section=windows 2.安装激活 Pycha ...
- 在阿里云CentOS 7创建swap分区
https://blog.tanteng.me/2016/03/aliyun-centos-7-swap/ Centos 系统swap虚拟内存添加与删除配置
- 启动MySql提示:The server quit without updating PID file(…)失败
1.可能是/usr/local/mysql/data/rekfan.pid文件没有写的权限解决方法 :给予权限,执行 "chown -R mysql:mysql /var/data" ...
- 工作笔记--自动切换host的python code
修改host代码: #coding:utf-8import os,timepwd = os.path.dirname(__file__) #获取当前文件夹的绝对路径pull_host_cmd = 'a ...
- ASP.NET Core的身份认证框架IdentityServer4--(4)添加第三方快捷登录
添加对外部认证的支持 接下来我们将添加对外部认证的支持.这非常简单,因为你真正需要的是一个兼容ASP.NET Core的认证处理程序. ASP.NET Core本身也支持Google,Facebook ...