gdi +绘制字符串倒置

时间:2014-04-03 10:55:14

标签: c++ gdi+

我正在尝试将文本写入我使用directshow从usb相机获取的位图。 问题是文本镜像倒置颠倒,我不知道为什么。

以下是编写文本的代码:

BITMAPINFOHEADER bih = m_videoInfo.bmiHeader;
Bitmap bmp(bih.biWidth, bih.biHeight, m_stride, m_pixFmt, pBuffer);
Graphics g(&bmp);

    if (this->introTimer->timeToDo())
    {

        RectF pos(10, 10, 100, 100);
        SolidBrush brush(Color::Black);

        Font font(FontFamily::GenericSerif(), 30);

        hr = g.DrawString(this->introText, -1, &font, pos, StringFormat::GenericDefault(), &brush);
        return hr;

    }

我不确定我的代码是否是影响字符串绘制的唯一因素。也许有一些配置或什么。

更新 我尝试使用Hans Passant建议的负高度。结果是文本根本没有写入。

2 个答案:

答案 0 :(得分:2)

显而易见的事情是在GDI +上设置转换。

基本上你需要反转Y轴(虽然通过这样做它现在将绘制屏幕)。因此,您需要按窗口大小将其翻译下来。

这样的事情:

 graphics.Transform = new Matrix2D( 1, 0,
                                    0, -1,
                                    0, -windowHeight );

然后正常画画。

(值得注意的是我在没有测试的情况下建议这样做.Y翻译可能不是负面的,所以试试两个!)。

答案 1 :(得分:1)

scanlines上下颠倒存储,内存中的第一次扫描(扫描0)是图像中最下面的扫描。这是Presentation Manager兼容性的另一个工件。 GDI在Set和Get操作期间自动反转图像。

关于Hans Passant的建议,你是否尝试过负高度? 他建议在bih中使用负高度。

BITMAPINFOHEADER bih = m_videoInfo.bmiHeader;
bih.biHeight = -bih.biHeight;
Bitmap bmp(bih.biWidth, bih.biHeight, m_stride, m_pixFmt, pBuffer);
...

如果有帮助,还要复制this page中的其他解决方案

void BitmapControl::OnPaint()
{
EnterCriticalSection (&CriticalSection);

if (_handleBMP)
{

    CPaintDC dc(this);
    //dc.SetMapMode(MM_ISOTROPIC);
    dc.SetMapMode(MM_LOENGLISH);
    CDC dcMem;
    dcMem.CreateCompatibleDC(&dc);

    CRect rect;
    GetClientRect(&rect);
    dc.DPtoLP(&rect);

    CBitmap* pBmpOld = dcMem.SelectObject(CBitmap::FromHandle(_handleBMP));

    //tst
    dc.SetStretchBltMode(COLORONCOLOR);

    //BitBlt(dc,rect.left,-0,rect.Width(),rect.Height(),dcMem,rect.left,rect.top,SRCCOPY); //works with MM_TEXT but upsidedown
    BitBlt(dc,0,rect.bottom,rect.Width(),-rect.Height(),dcMem,0,0,SRCCOPY); //works with MM_LOENGLISH
    dcMem.SelectObject(pBmpOld);
    DeleteDC(dc);
    DeleteDC(dcMem);
    DeleteObject(_handleBMP);
    DeleteObject(pBmpOld);
    _handleBMP = NULL;

}
LeaveCriticalSection (&CriticalSection);
}