首页 > 解决方案 > MFC GDI+ 文本渲染问题

问题描述

我目前正在使用 5MP 相机,因此我将 BYTE* 转换为 GDI+ Bitmap 对象并使用 Graphics 对象在图片控件上绘制(所有 GDI+ 对象)

我想在上面画一个字符串,当我这样做时,分辨率(质量或其他)变得奇怪。这是图像。

原始图像(捕获)

这是原始图像

上面的文字

这是上面有文字的图像

这是我的代码。它使用 MFC 的 WM_MOUSEMOVE。当鼠标指针到达 CRect(dispRC[array]) 时,它会在 Bitmap 对象上呈现字符串“aa”。

当我这样做时,图像质量会降低,或者我不完全知道它会改变图像。(您可能不会注意到,因为这些是捕获的图像,但后一个图像的质量会降低。)

void CSmall_StudioDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    CPoint insidePoint;
// MAXCAM is the number of bitmap objects.
    for (int i = 0; i < MAXCAM; i++)
    {
// m_pBitmap[MAXCAM] is array of Bitmap* which contains address of Gdiplus::Bitmap objects.
        if (m_pBitmap[i] != NULL)
        {
// m_rcDisp[MAXCAM] are CRect objects which has information of picture control.
// i.e. GetDlgItem(IDC_BIN_DISP)->GetWindowRect(m_rcDisp[BINARY_VID]);
            if (point.x > m_rcDisp[i].TopLeft().x && point.y > m_rcDisp[i].TopLeft().y)
            {
                if (point.x < m_rcDisp[i].BottomRight().x && point.y < m_rcDisp[i].BottomRight().y)
                {
                    StringFormat SF;

                    insidePoint.x = point.x - m_rcDisp[i].TopLeft().x;
                    insidePoint.y = point.y - m_rcDisp[i].TopLeft().y;

                    Graphics textG(m_pBitmap[i]);
                    textG.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel);
                    Gdiplus::Font F(L"Palatino Linotype Bold", 10, FontStyleBold, UnitPixel);
                    RectF R(insidePoint.x, insidePoint.y, 20, 100);

                    SF.SetAlignment(StringAlignmentCenter);
                    SF.SetLineAlignment(StringAlignmentCenter);

                    SolidBrush B(Color(0, 0, 0));

                    textG.DrawString(_T("aa"), -1, &F, R, &SF, &B);
// m_pGraphics[MAXCAM] is made like this
// i.e.
// static CClientDC roiDc(GetDlgItem(IDC_ROI_DISP));
// m_hDC[ROI_VID] = roiDc.GetSafeHdc();
// m_pGraphics[ROI_VID] = Graphics::FromHDC(m_hDC[ROI_VID]);
                    m_pGraphics[i]->DrawImage(m_pBitmap[i], 0, 0, m_vidwidth[i], m_vidheight[i]);
                }
            }
        }

        
    }

    CDialogEx::OnMouseMove(nFlags, point);
}

希望我得到一个有用的答案。

谢谢!

标签: c++mfcgdi+

解决方案


我遇到了类似的问题,并通过从 Windows 字体创建 GDI+ 字体来解决它,如下所示:

Gdiplus::Font font(hDc, hFont);

其中 hDc 是 DC 句柄, hFont 是字体句柄。

如果这有帮助,你可以试试吗?


推荐阅读