我近来写了个摄像头的抓图程序,在许多机器上都能运行正常,可是有两台电脑不能抓图,生成的图片一片空白。真不知道是为什么?
    请大家想想原因及解决办法。

解决方案 »

  1.   

    我用的抓图方法是继承ISampleGrabberCB,重写BufferCB()函数。
    代码如下:
    STDMETHODIMP SampleGrabberCallback::BufferCB(double Time, BYTE *pBuffer, long BufferLen)
    {
        if (! m_bOneShot)  return VFW_E_INVALIDMEDIATYPE;    HANDLE hf = CreateFile(m_szFileName, GENERIC_WRITE, 
            FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
        if (hf == INVALID_HANDLE_VALUE)
        {
    m_bOneShot = false;
    return E_FAIL;
        }
        long cbBitmapInfoSize = m_StillMediaType.cbFormat - SIZE_PREHEADER;
        VIDEOINFOHEADER *pVideoHeader =(VIDEOINFOHEADER*)m_StillMediaType.pbFormat;    BITMAPFILEHEADER bfh;
        ZeroMemory(&bfh, sizeof(bfh));
        bfh.bfType = 'MB';  // Little-endian for "MB".
        bfh.bfSize = sizeof( bfh ) + BufferLen + cbBitmapInfoSize;
        bfh.bfOffBits = sizeof( BITMAPFILEHEADER ) + cbBitmapInfoSize;
            
        // Write the file header.
        DWORD dwWritten = 0;
        WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );
        WriteFile(hf, HEADER(pVideoHeader), cbBitmapInfoSize, &dwWritten, NULL);        
        WriteFile( hf, pBuffer, BufferLen, &dwWritten, NULL );
        CloseHandle( hf ); m_bOneShot = false;
        return S_OK;
    }
      

  2.   

    STDMETHODIMP BufferCB( double SampleTime, BYTE * pBuffer, long BufferSize )
        {
            //
            // Convert the buffer into a bitmap
            //
            TCHAR szFilename[MAX_PATH];
            wsprintf(szFilename, TEXT("Bitmap%5.5ld.bmp\0"), long( SampleTime * 1000 ) );        // Create a file to hold the bitmap
            HANDLE hf = CreateFile(szFilename, GENERIC_WRITE, FILE_SHARE_READ, 
                                   NULL, CREATE_ALWAYS, NULL, NULL );        if( hf == INVALID_HANDLE_VALUE )
            {
                return 0;
            }        _tprintf(TEXT("Found a sample at time %ld ms\t[%s]\r\n"), 
                     long( SampleTime * 1000 ), szFilename );        // Write out the file header
            //
            BITMAPFILEHEADER bfh;
            memset( &bfh, 0, sizeof( bfh ) );
            bfh.bfType = 'MB';
            bfh.bfSize = sizeof( bfh ) + BufferSize + sizeof( BITMAPINFOHEADER );
            bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );        DWORD Written = 0;
            WriteFile( hf, &bfh, sizeof( bfh ), &Written, NULL );        // Write the bitmap format
            //
            BITMAPINFOHEADER bih;
            memset( &bih, 0, sizeof( bih ) );
            bih.biSize = sizeof( bih );
            bih.biWidth = Width;
            bih.biHeight = Height;
            bih.biPlanes = 1;
            bih.biBitCount = 24;        Written = 0;
            WriteFile( hf, &bih, sizeof( bih ), &Written, NULL );        // Write the bitmap bits
            //
            Written = 0;
            WriteFile( hf, pBuffer, BufferSize, &Written, NULL );        CloseHandle( hf );        return 0;
        }你的BMP图是几位的?
    参考一下例子吧!
      

  3.   

    谢谢大家了!
    在调试中发现函数传的参数pBuffer里的内容不正确。
    这是怎么回事呢?