2013-06-16 3 views
1

Я хочу, чтобы нарисовать текст на растр, и я сделал это с сводном кодом нижеТекст поворачивается при использовании DrawText() в растровом изображении?

BITMAPINFO bitmapInfo; 
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
bitmapInfo.bmiHeader.biWidth = _imgWidth; 
bitmapInfo.bmiHeader.biHeight = _imgHeight; 
bitmapInfo.bmiHeader.biPlanes = 1; 
bitmapInfo.bmiHeader.biBitCount = 24; 
bitmapInfo.bmiHeader.biCompression = BI_RGB; 
bitmapInfo.bmiHeader.biSizeImage = 0; 

HDC hdc = GetDC(NULL); 
if (hdc == NULL) 
    return false; 

HFONT hFont = CreateFont(50, 0, 0, 0, FW_BOLD, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, 0, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial"); 
if(hFont == NULL) 
    return false; 

HBITMAP hBitmap = CreateDIBitmap(hdc, (LPBITMAPINFOHEADER) &bitmapInfo.bmiHeader, CBM_INIT, _BRG24arrayIn, (LPBITMAPINFO) &bitmapInfo, DIB_RGB_COLORS); 
if(hBitmap == NULL) 
    return false; 

HDC hMemDC = CreateCompatibleDC(hdc); 
if (hMemDC == NULL) 
    return false; 

HBITMAP hBitmapOld = (HBITMAP)SelectObject(hMemDC, hBitmap); 
if(hBitmapOld == NULL) 
    return false; 

HFONT hFontOld = (HFONT)SelectObject(hMemDC, hFont); 
if (hFontOld == NULL) 
    return false; 

SetBkMode(hMemDC, TRANSPARENT); 
SetTextColor(hMemDC, 0x0000FF00); 
RECT rect; 
SetRect(&rect, 0, 0, _imgWidth, _imgHeight); 

if (DrawText(hMemDC, "11:41:33", -1, &rect, DT_TOP|DT_LEFT) == 0) 
    return false; 

GetDIBits(hdc, hBitmap, 0, _imgHeight, _BRG24arrayOut, (LPBITMAPINFO)&bitmapInfo, DIB_RGB_COLORS); 
return true; 

текст, который я хочу обратить это "11:41:33" и выравнивание текста является DT_TOP|DT_LEFT

Но результат текст вращается и произошло на левой нижней части, как результат изображения ниже

enter image description here

входного массива _BRG24arrayIn находится в BRG24, кто-то может сказать мне, что произойдет?

Большое спасибо,

T & TGroup!

+2

Не повернуто, оно перевернуто. Это имеет тенденцию происходить с растровыми изображениями, они обычно сохраняются инвертированными с последней строкой сканирования в начале растрового изображения. Неясно, что вы делаете после этого кода, что делает эту реализацию видимой. Использование GDI + - лучшая мышеловка, чтобы избежать подобных аварий. –

+0

Поблагодарите Hans Passant! Многие люди используют этот код для рисования текста в растровом изображении, и я не нашел никого, кто бы встретил эту проблему, можете ли вы показать мне, как исправить этот код, не используя GDI +? – TTGroup

+1

Я не знаю, нужно ли исправление, я думаю, что вы делаете что-то неправильно после этого кода. Подобно тому, как вы показываете или сохраняете его. И я бы никогда не писал такой код, GDI + просто * легко. Нет, я не могу тебе показать. –

ответ

3

Вам нужно отменить высоту в структуре BITMAPINFOHEADER, чтобы получить растровое изображение сверху вниз (то есть, где строка 0 находится сверху, а не внизу). Например:

bitmapInfo.bmiHeader.biHeight = -_imgHeight; 
+0

Это сработало! Большое вам спасибо! – TTGroup

Смежные вопросы