我正在尝试将文本写入我使用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建议的负高度。结果是文本根本没有写入。
答案 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);
}