位图显示文字背景色重叠问题

时间:2021-01-17 14:51:57
最近我想实现一个在视频上叠加文字功能,目前此功能已经实现,但发现视频在动态改变时有时和文字的背景色相重,使得文字显示无法体现出来
之前我就看过这类技术(在海康的板卡开发里的OSD显示),他的OSD文字可以随着视频背景改变,不知道这样的技术怎么称呼
其实之前我也想过取视频的背景像素,根据这个来改变文字的背景色,但这种效率比较低,而且实现后效果也不是很好
因为我是drawtext往图片写文字的,设置字体色也只能设全部的文字色,但图片的背影可能在有的重叠地方是不需要改变字体色有的需要,不知道有什么方法实现这个?

8 个解决方案

#1


SetBkMode(m_hdc, TRANSPARENT);

#2


这个我当然设了 可能你还没理解我的意思
我是说当视频画面颜色和上面叠加文字的颜色一致时就看不清文字了
这时需要改变字体色才能显示出来 而且视频的颜色可能只有部份和文字颜色一致 如果使用设置字体色的函数设置和视频画面不同颜色话会导致只有部份文字显示正常 其它的有可能显示不正常
也就是说现在需要做的是根据视频动态的使字体色的每个像素与叠加在视频的区域的像素不重叠的话就可以显示出文字

#3


那海康的全部文字同一个颜色?

#4


不是 我之前做过板卡开发 所以这块还是记得比较清楚 我当时试过当文字区域视频全黑时字体颜色是白色的,当文字区域视频全白时字体颜色是黑色的 如果文字区域背影为多色 每个文字的颜色也会根据视频区域色做想应调整 我就是想达到这个效果

#5


取得字体的二维点阵,然后往屏幕上逐个像素的贴,此时就可以根据视频背景颜色改变文字的颜色

#6


思路这样是没错 但效率比较低 我是在移动设备上做这个处理
我发现tcpmp的字幕是使用ExtTextOut写上去的到时候试试看能不能达到效果 其实字幕跟这个类似

#7


加边框,这样比较不错

#8


今天回家试了一下,发现修改RGB值文字的颜色根本没变化,但看是能看得出上面的字
我的代码如下,还请知道的帮下忙

初始化函数
m_bmpInfo.bmiHeader=pVih->bmiHeader;
m_hDibSection = CreateDIBSection(NULL, (BITMAPINFO *) &m_bmpInfo, DIB_RGB_COLORS,&m_pPaintBuffer, NULL, 0);

HDC hDC = GetDC(NULL);
m_dcPaint = CreateCompatibleDC(hDC);
LOGFONT font;
memset(&font,0,sizeof(font));
font.lfHeight=15;
HFONT hfont=CreateFontIndirect(&font);
SelectObject(m_dcPaint,hfont);
HGDIOBJ OldObject = SelectObject(m_dcPaint,m_hDibSection);
处理图片文字函数
void DrawString(void * pBuffer,UINT len,CString text)
{
//Clear DC paintbuffer
PatBlt(m_dcPaint,0,0,m_bmpInfo.bmiHeader.biWidth,m_bmpInfo.bmiHeader.biHeight,BLACKNESS);
//Copy Sample to DC paintbuffer
CopyMemory(m_pPaintBuffer,pBuffer,len);
//Text background color
SetBkMode(m_dcPaint,TRANSPARENT);
// Text Color
SetTextColor(m_dcPaint,RGB(255,0,255));

//Do the text
 DrawText(m_dcPaint,text,text.GetLength(),CRect(0,0,m_bmpInfo.bmiHeader.biWidth,m_bmpInfo.bmiHeader.biHeight),DT_BOTTOM|DT_RIGHT);
//Copy sample back to original buffer
CopyMemory(pBuffer,m_pPaintBuffer,len);
}

#1


SetBkMode(m_hdc, TRANSPARENT);

#2


这个我当然设了 可能你还没理解我的意思
我是说当视频画面颜色和上面叠加文字的颜色一致时就看不清文字了
这时需要改变字体色才能显示出来 而且视频的颜色可能只有部份和文字颜色一致 如果使用设置字体色的函数设置和视频画面不同颜色话会导致只有部份文字显示正常 其它的有可能显示不正常
也就是说现在需要做的是根据视频动态的使字体色的每个像素与叠加在视频的区域的像素不重叠的话就可以显示出文字

#3


那海康的全部文字同一个颜色?

#4


不是 我之前做过板卡开发 所以这块还是记得比较清楚 我当时试过当文字区域视频全黑时字体颜色是白色的,当文字区域视频全白时字体颜色是黑色的 如果文字区域背影为多色 每个文字的颜色也会根据视频区域色做想应调整 我就是想达到这个效果

#5


取得字体的二维点阵,然后往屏幕上逐个像素的贴,此时就可以根据视频背景颜色改变文字的颜色

#6


思路这样是没错 但效率比较低 我是在移动设备上做这个处理
我发现tcpmp的字幕是使用ExtTextOut写上去的到时候试试看能不能达到效果 其实字幕跟这个类似

#7


加边框,这样比较不错

#8


今天回家试了一下,发现修改RGB值文字的颜色根本没变化,但看是能看得出上面的字
我的代码如下,还请知道的帮下忙

初始化函数
m_bmpInfo.bmiHeader=pVih->bmiHeader;
m_hDibSection = CreateDIBSection(NULL, (BITMAPINFO *) &m_bmpInfo, DIB_RGB_COLORS,&m_pPaintBuffer, NULL, 0);

HDC hDC = GetDC(NULL);
m_dcPaint = CreateCompatibleDC(hDC);
LOGFONT font;
memset(&font,0,sizeof(font));
font.lfHeight=15;
HFONT hfont=CreateFontIndirect(&font);
SelectObject(m_dcPaint,hfont);
HGDIOBJ OldObject = SelectObject(m_dcPaint,m_hDibSection);
处理图片文字函数
void DrawString(void * pBuffer,UINT len,CString text)
{
//Clear DC paintbuffer
PatBlt(m_dcPaint,0,0,m_bmpInfo.bmiHeader.biWidth,m_bmpInfo.bmiHeader.biHeight,BLACKNESS);
//Copy Sample to DC paintbuffer
CopyMemory(m_pPaintBuffer,pBuffer,len);
//Text background color
SetBkMode(m_dcPaint,TRANSPARENT);
// Text Color
SetTextColor(m_dcPaint,RGB(255,0,255));

//Do the text
 DrawText(m_dcPaint,text,text.GetLength(),CRect(0,0,m_bmpInfo.bmiHeader.biWidth,m_bmpInfo.bmiHeader.biHeight),DT_BOTTOM|DT_RIGHT);
//Copy sample back to original buffer
CopyMemory(pBuffer,m_pPaintBuffer,len);
}