我使用此代码从网络摄像头签名框架:
Font = CreateFont(18, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH, "times");
...
HDC hDC = CreateCompatibleDC(NULL);
unsigned char * img = 0;
HBITMAP hBitmap = CreateDIBSection(hDC, &BMI, DIB_RGB_COLORS, (void**)&img, NULL, 0);
memcpy(img, CameraFrame.data, CameraFrame.size());
free(CameraFrame.data);
CameraFrame.data = img;
SelectObject(hDC, hBitmap);
SelectObject(hDC, Font);
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(255,255,255));
string Text = "Test";
DrawTextA(hDC, Text.c_str(), Text.size(), &rect, DT_CENTER | DT_WORDBREAK);
DeleteDC(hDC);
当然,帧的色阶会有所不同,我还是需要文本可见。
如何使用大纲来DrawText
?例如,黑色轮廓的白色文字。
答案 0 :(得分:2)
两种方法:
以黑色绘制文字,但缩小2像素(祝你好运),偏移缩放(-1,-1),然后通常在中心白色。
以黑色绘制文字,但偏移{ (-1,-1), (1,1), (-1,1), (1,-1) }
,然后在中间以白色绘制。
答案 1 :(得分:1)
使用GDI,只要您使用“大纲”字体(如TrueType或OpenType),就可以使用BeginPath,DrawText,EndPath和StrokeAndFillPath。
::BeginPath(ps.hdc);
RECT rc;
GetClientRect(&rc);
::DrawTextW(ps.hdc, L"Hello", 5, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
::EndPath(ps.hdc);
::StrokeAndFillPath(ps.hdc);
StrokeAndFillPath将使用当前选定的笔作为轮廓,并使用当前选定的笔刷填充它。您可以在BeginPath / EndPath内使用TextOut或其他GDI调用。
您不会像常规文本输出一样获得任何抗锯齿,因此它不会像常规ClearType文本那样清晰。在较大的尺寸,这不是一个大问题。
答案 2 :(得分:0)
以下是我的建议:
初始化时会发生第1步。每次涂漆都会发生步骤2-4。