2015-07-17 3 views
0

Я работаю над видеомагнитофоном для веб-камеры, и мне было интересно попробовать все, когда дело касается этой темы, но есть эта проблема, которую я не могу решить.C++ VIDEOHDR to Image File в capVideoStreamCallback

Все, что вы могли бы задаться вопросом о том, можно найти здесь https://msdn.microsoft.com/en-us/library/windows/desktop/dd757677%28v=vs.85%29.aspx и здесь https://msdn.microsoft.com/en-us/library/windows/desktop/dd757694%28v=vs.85%29.aspx

Теперь, в этом коде

if (capSetCallbackOnVideoStream(hCapWnd, capVideoStreamCallback)) 
{ 
    capCaptureSequenceNoFile(hCapWnd); //Capture 
} 

Я убеждаюсь, что каждый кадр, который получает захвачены отправляется capVideoStreamCallback.

Теперь, что я пытаюсь сделать, это преобразовать кадр в изображение и сохранить его где-то, это может быть бесполезно, но это интересно, и это, безусловно, возможно.

Вот моя функция capVideoStreamCallback (это комментарий):

LRESULT CALLBACK capVideoStreamCallback(HWND hWnd, LPVIDEOHDR lpVHdr) 
{ 
    BYTE *Image; 
    BITMAPINFO * TempBitmapInfo = new BITMAPINFO; 
    ULONG Size; 

    // First we need to get the full size of the image 
    Size = capGetVideoFormat(hWnd, TempBitmapInfo, sizeof(BITMAPINFO)); //header size 
    Size += lpVHdr->dwBytesUsed; //bytes used 

    Image = new BYTE[Size]; 
    memcpy(Image, TempBitmapInfo, sizeof(BITMAPINFO)); //copy the header to Image 

    // lpVHdr is LPVIDEOHER passed into callback function. 
    memcpy(Image + sizeof(BITMAPINFO), lpVHdr->lpData, lpVHdr->dwBytesUsed); //copy the data to Image 

    //write the image 
    ofstream output("image.dib", ios::binary); 
    for (int i = 0; i < Size; i++) 
    { 
     output << (BYTE)Image[i]; 
    } 
    output.close(); 

    return (LRESULT)TRUE; 
} 

Таким образом, информация о каждом кадре, который отправляется в capVideoStreamCallback можно найти в lpVHdr, который является структурой (https://msdn.microsoft.com/en-us/library/windows/desktop/dd757688%28v=vs.85%29.aspx) и то, что я m пытается сделать здесь, это взять эту информацию и преобразовать ее в изображение.

Сначала я начинаю с получения полного размера изображения, получая размер заголовка и размер данных, а затем я динамически объявлял массив BYTE под названием «Изображение» и копировал заголовок и данные в изображение с помощью memcpy. Я, наконец, использовал streamstream для записи байтов в файл, и это в значительной степени.

Проблема в том, что все работает отлично, но изображение каким-то образом повреждено, потому что оно невозможно открыть.

Что не так в том, что я делаю? Это кажется логичным, но он не работает. Пожалуйста, поделитесь своими идеями и спасибо за чтение.

+0

I что вы не можете использовать вывод << при записи в двоичный файл, поэтому я заменил его на output.write ((char *) Image, Size), но двоичный файл все еще не открывается/поврежден. Может кто-нибудь дать мне руку здесь? – MarioAda

ответ

0

Вот ответ от Frankie-C от http://codeproject.com, который напомнил мне, что мне нужна структура BITMAPFILEHEADER в верхней части файла BITMAP.

Там также несколько дополнительных вещей, которые вы должны сделать, чтобы получить изображение, чтобы показать, как оно должно быть таким, как листать байт, чтобы получить BGR вместо RGB и т.д., здесь хороший репетит объясняя, что: http://tipsandtricks.runicsoft.com/Cpp/BitmapTutorial.htm