1 unsigned char *pTemp;
2 BYTE OsdY = 0;
3 BYTE OsdU = 0;
4 BYTE OsdV = 0;
5
6 void OSDSetTextColor(BYTE OsdR, BYTE OsdG, BYTE OsdB)
7 {
8 OsdY = 0.25*OsdR+0.504*OsdG+0.098*OsdB+16;
9 OsdU = -0.148*OsdR-0.291*OsdG+0.439*OsdB+128;
10 OsdV = 0.439*OsdR-0.368*OsdG-0.071*OsdB+128;
11 }
12
13 void CTest0Dlg::setOSD()
14 {
15 FILE *fp=fopen("d:\\temp\\OSD.bmp", "rb");
16 if (fp == 0)
17 return;
18
19 HDC hDC = ::GetDC(GetSafeHwnd());
20 HDC hMemDC = CreateCompatibleDC(hDC);
21 fseek(fp, sizeof(BITMAPFILEHEADER), 0);
22 BITMAPINFOHEADER head;
23 fread(&head, sizeof(BITMAPINFOHEADER), 1, fp);
24 int bmpHeight = head.biHeight;
25 int bmpWidth = head.biWidth;
26 int biBitCount = head.biBitCount;
27 int lineByte = (bmpWidth*biBitCount/8+3)/4*4;
28 RGBQUAD *pColorTable;
29 unsigned char *pBmpBuf = new unsigned char[lineByte*bmpHeight];
30 fread(pBmpBuf, 1, lineByte*bmpHeight, fp);
31 memset(pBmpBuf,0, lineByte*bmpHeight);
32
33 CDC *m_pMemDC;
34 m_pMemDC = new CDC();
35 CDC *pDC;
36 pDC = GetDC();
37 m_pMemDC->CreateCompatibleDC(pDC);
38 CBitmap *m_pOldBmp = NULL;
39 CBitmap *m_pMemBmp = new CBitmap();//根据图片的大小创建一个兼容位图
40 m_pMemBmp->CreateCompatibleBitmap(pDC, bmpWidth, bmpHeight);
41 m_pOldBmp = m_pMemDC->SelectObject(m_pMemBmp);
42
43 // 把图像的数据绘制到兼容位图上
44 SetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject, 0, bmpHeight, (LPVOID)pBmpBuf, (BITMAPINFO*)&head, DIB_RGB_COLORS);
45 m_pMemDC->SetBkMode(TRANSPARENT);
46 m_pMemDC->SetTextColor(RGB(255, 0, 0));//RGB标记色
47 OSDSetTextColor(0, 0, 0);//OSD显示色
48
49 //设置字体
50 CFont font;
51 font.CreateFont(20,15,0,0,10,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,"宋体");
52 SelectObject(hMemDC, font);
53 ///////////////////////////
54 SYSTEMTIME st;
55 CString strDate,strTime;
56 GetLocalTime(&st);
57 strDate.Format("时间 %04d-%02d-%02d ",st.wYear,st.wMonth,st.wDay);
58 strTime.Format("%02d:%02d:%02d",st.wHour,st.wMinute,st.wSecond);
59 // 添加文字到指定位置
60 m_pMemDC->TextOut(20, 40, strDate+strTime);
61
62 pTemp = new unsigned char[lineByte*bmpHeight];
63 GetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject, 0, bmpHeight, (LPVOID)pTemp, (BITMAPINFO*)&head, DIB_RGB_COLORS);
64 fclose(fp);
65
66 delete m_pMemBmp;
67 delete m_pMemDC;
68 delete[] pBmpBuf;
69
70
71 //MessageBox("VOER!");
72 }
73
74 调用部分
75 //////////////////////////////////////////////////////////////////////////////////////
76 setOSD();
77 for (int i=0;i<80;i++)
78 {
79 for (int k=0;k<640;k++)
80 {
81 //dc.SetPixel(k,79-i,RGB(pTemp[(i*640+k)*3+2],pTemp[(i*640+k)*3+1],pTemp[(i*640+k)*3+0]));
82 if (pTemp[(i*640+k)*3+2]!=0)//需要叠加 通过标记色过滤
83 {
84 pFrameYUV->data[0][(79-i)*720+k]=OsdY;
85 if ((79-i)%2==0)
86 {
87 pFrameYUV->data[1][(79-i)*720/4+k/2]=OsdU;
88 pFrameYUV->data[2][(79-i)*720/4+k/2]=OsdV;
89 }
90 }
91 }
92 }
93 /////////////////////////////////////////////////////////////////////////////////////////
94
95 //拷贝数据yuv420,也可预先改变指针
96 memcpy(image->pixels[0], pFrameYUV->data[0],720*576);
97 memcpy(image->pixels[2], pFrameYUV->data[1],720*576/4);
98 memcpy(image->pixels[1], pFrameYUV->data[2],720*576/4);