2017-05-26 5 views
0

Ich brauche einen Zeitstempel auf Webcam Rahmen zu drucken und versucht als nächstes zu tun:DrawText auf HBITMAP ohne "sichtbares" DC?

CameraFrameBufferSize = WebCam->GetFrameSize(); 
CameraFrameBuffer = (unsigned char *)realloc(CameraFrameBuffer, CameraFrameBufferSize); 
unsigned char * buf = WebCam->CaptureFrame(); // returns pointer to RGB buffer of frame 

HDC hDC = CreateCompatibleDC(NULL); 
HFONT font = CreateFont(20, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH, "times"); 
RECT rect; 
rect.left = 0; 
rect.right = WebCam->GetFrameWidth(); 
rect.top = 10; 
rect.bottom = 50; 

HBITMAP hBitmap = CreateHBITMAPfromByteArray(hDC, WebCam->GetFrameWidth(), WebCam->GetFrameHeight(), 3, buf); 

SelectObject(hDC, hBitmap); 
SelectObject(hDC, font); 
SetBkMode(hDC, TRANSPARENT); 
SetTextColor(hDC, RGB(255,255,255)); 
string Text = GetTime("%Y.%m.%d %H:%M:%S"); 
DrawTextA(hDC, Text.c_str(), Text.size(), &rect, DT_CENTER | DT_WORDBREAK); 

jpge::compress_image_to_jpeg_file_in_memory(CameraFrameBuffer, CameraFrameBufferSize, WebCam->GetFrameWidth() ,WebCam->GetFrameHeight(), 3, buf, CameraCompressor); 

CameraFrame = string(reinterpret_cast<char*>(CameraFrameBuffer), CameraFrameBufferSize); 
ReleaseDC(NULL, hDC); 
DeleteObject(hBitmap); 
DeleteObject(font); 

CreateHBITMAPfromByteArray ist:

HBITMAP CreateHBITMAPfromByteArray(HDC hdc, int Width, int Height, int Colors, unsigned char* pImageData){ 
    LPBITMAPINFO lpbi = new BITMAPINFO; 
    lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
    lpbi->bmiHeader.biWidth = Width; 
    lpbi->bmiHeader.biHeight = -Height; 
    lpbi->bmiHeader.biPlanes = 1; 
    lpbi->bmiHeader.biBitCount = Colors*8; 
    lpbi->bmiHeader.biCompression = BI_RGB; 
    lpbi->bmiHeader.biSizeImage = 0; 
    lpbi->bmiHeader.biXPelsPerMeter = 0; 
    lpbi->bmiHeader.biYPelsPerMeter = 0; 
    lpbi->bmiHeader.biClrUsed = 0; 
    lpbi->bmiHeader.biClrImportant = 0; 

    return CreateDIBSection(hdc, lpbi, DIB_RGB_COLORS,(void **)&pImageData,NULL,0); 
} 

Und ich bin immer nur einen Rahmen ohne Text, wenn ein Testbild-Datei speichern (string CameraFrame) ...

Die Kamera schießt im Hintergrund und nichts wird auf dem Bildschirm angezeigt, also bin ich mir nicht sicher über HDC, die ich auswähle.

Im Allgemeinen habe ich einen RGB-Puffer von Bild, wo der Text mit Transparenz platziert werden muss. Wie implementiert man das?

Antwort

1

Es sieht so aus, als würden Sie den ursprünglichen Kamerarahmenpuffer (buf) komprimieren (und speichern), nicht den Bitmap-Puffer. Die Verwendung von CreateDIBSection ist ebenfalls falsch, da param # 4 ein out-Parameter ist, der einen Zeiger auf die Position der DIB-Bitwerte erhalten soll und Sie versuchen, dort einen Zeiger auf vorhandene Bilddaten zu übergeben.

+0

Ja, ich habe CreateDIBSection falsch verwendet. Vielen Dank. – Iceman