[C++] Write Text On Byte Array by using HDC
HBITMAP CreateHBITMAPfromByteArray(HDC hdc, int nImageWidth, int nImageHeight, BYTE* pImageData)
{
BITMAPINFOHEADER bmih;
memset(&bmih, 0, sizeof(BITMAPINFOHEADER));
bmih.biWidth = nImageWidth;
bmih.biHeight = nImageHeight;
bmih.biBitCount = 32;
bmih.biCompression = BI_RGB;
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biPlanes = 1;
BITMAPINFO* bmi = (BITMAPINFO*)&bmih;
return CreateDIBitmap(hdc, &bmih, CBM_INIT, pImageData, bmi, DIB_RGB_COLORS);
}
void WriteTextOnByteArray(int nImageWidth, int nImageHeight, int x, int y, BYTE* pImageData, HFONT hFont, const wchar_t* szText, COLORREF backColor, COLORREF textColor)
{
HDC hdc = GetDC(NULL);
HDC memDC = CreateCompatibleDC(hdc);
//HBITMAP hBmp = CreateCompatibleBitmap(hdc, m_nImageWidth, m_nImageHeight);
HBITMAP hBmp = CreateHBITMAPfromByteArray(hdc, nImageWidth, nImageHeight, pImageData);
HGDIOBJ oldBMP = SelectObject(memDC, hBmp);
HGDIOBJ oldFont = SelectObject(memDC, hFont);
SetBkMode(memDC, TRANSPARENT);
SetTextColor(memDC, textColor);
RECT rect;
rect.left = 0;
rect.right = nImageWidth;
rect.top = 0;
rect.bottom = nImageHeight;
HBRUSH hBrush = CreateSolidBrush(backColor);
FillRect(memDC, &rect, hBrush);
TextOutW(memDC, x, y, szText, wcslen(szText));
SelectObject(memDC, oldBMP);
SelectObject(memDC, oldFont);
BITMAPINFO bmpInfo;
memset(&bmpInfo, 0, sizeof(BITMAPINFOHEADER));
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
GetDIBits(memDC, hBmp, 0, 0, NULL, &bmpInfo, DIB_RGB_COLORS);
bmpInfo.bmiHeader.biBitCount = 32;
bmpInfo.bmiHeader.biCompression = BI_RGB;
GetDIBits(memDC, hBmp, 0, bmpInfo.bmiHeader.biHeight, pImageData, &bmpInfo, DIB_RGB_COLORS);
DeleteObject(hBmp);
DeleteObject(hBrush);
DeleteDC(memDC);
ReleaseDC(NULL, hdc);
}