2017-05-26 13 views
0

私はウェブカメラのフレームにタイムスタンプを印刷する必要があると次に何をしようとした:"可視" DCのないHBITMAPのDrawText?

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は次のとおりです。

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); 
} 

とテストイメージファイルを保存するとき、私はテキストなしでちょうどフレームを取得しています(文字列CameraFrame)...

カメラはバックグラウンドで撮影し、画面に何も表示されないため、私は選択しているHDCについてはわかりません。

一般に、透明なテキストを配置する必要がある画像のRGBバッファがあります。それを実装する方法は?

答えて

1

ビットマップバッファではなく元のカメラフレームバッファbufを圧縮(保存)しているようです。 CreateDIBSectionの使用法も間違っています。なぜなら、param#4はDIBビット値の位置へのポインタを受け取ったアウトパラメータであり、そこで既存のイメージデータへのポインタを渡そうとしているからです。

+0

はい、間違った方法で 'CreateDIBSection'を使用しました。ありがとう。 – Iceman

関連する問題