hur.cn - 华软网

 热门搜索

还原缓冲中的图片信息

  作者:未知    来源:网络    更新时间:2011/9/7
我通过如下方法将图片放在缓冲中,如何还原出来显示在picture中
C++">
AM_MEDIA_TYPE mt;
HRESULT hr = pGrabber->GetConnectedMediaType(&mt);
VIDEOINFOHEADER *pVih;
long bmSize=0;
hr = pGrabber->GetCurrentBuffer(&bmSize,NULL);

long *pBuffer=new long [bmSize];
hr = pGrabber->GetCurrentBuffer(&bmSize,pBuffer);

if ((mt.formattype == FORMAT_VideoInfo) &&
(mt.cbFormat>=sizeof(VIDEOINFOHEADER))&&
(mt.pbFormat!=NULL))
{
pVih = reinterpret_cast<VIDEOINFOHEADER*>(mt.pbFormat);

}
else  
{
// Free the format block when you are done:
FreeMediaType(mt);
return VFW_E_INVALIDMEDIATYPE; // Something went wrong
// pVih->bmiHeader is the BITMAPINFOHEADER for the frame.
}


---华软 网友回答---
http://hi.baidu.com/ddrmsdos/blog/item/68d3fdc41a432aa88226acb7.html
---华软网友回复---
我做了修改
C++">
AM_MEDIA_TYPE mt;
    HRESULT hr = pGrabber->GetConnectedMediaType(&mt);
    VIDEOINFOHEADER *pVih;
    long bmSize=0;
    hr = pGrabber->GetCurrentBuffer(&bmSize,NULL);

    long *pBuffer=new long [bmSize];
    hr = pGrabber->GetCurrentBuffer(&bmSize,pBuffer);
    
    if ((mt.formattype == FORMAT_VideoInfo) &&
        (mt.cbFormat>=sizeof(VIDEOINFOHEADER))&&
        (mt.pbFormat!=NULL))
    {
        pVih = reinterpret_cast<VIDEOINFOHEADER*>(mt.pbFormat);
        
    }
    else  
    {
        // Free the format block when you are done:
        FreeMediaType(mt);
        return VFW_E_INVALIDMEDIATYPE; // Something went wrong
        // pVih->bmiHeader is the BITMAPINFOHEADER for the frame.
    }

    BITMAPFILEHEADER    hdr;
    LPBITMAPINFOHEADER    lpbi;
    
    lpbi = (LPBITMAPINFOHEADER)pBuffer;
    
    int nColors = 0;            //调色板中的颜色个数.(RGB格式在8位以下的,需要用调色板。
    //调色板实际上就是定义一些颜色的数组)
    if (lpbi->biBitCount <= 8)    //biBitCount:每个像素的位数.PS:RGB32每个像素用32位表示,也就是4个字节
        nColors = 1 << lpbi->biBitCount;
    
    hdr.bfType        = ((WORD) ('M' << 8) | 'B');    //always is "BM"
    hdr.bfSize        = bmSize + sizeof( hdr );
    hdr.bfReserved1     = 0;
    hdr.bfReserved2     = 0;
    hdr.bfOffBits        = (DWORD) (sizeof(BITMAPFILEHEADER) + lpbi->biSize +
        nColors * sizeof(RGBQUAD));

    newbitmapSize = sizeof(BITMAPFILEHEADER) + bmSize;
    newbuffer = new byte[newbitmapSize ];
    memset(newbuffer, 0 , newbitmapSize);
    memcpy(newbuffer, &hdr, sizeof(BITMAPFILEHEADER));
    memcpy(newbuffer + sizeof(BITMAPFILEHEADER), pBuffer, newbitmapSize);
    FreeMediaType(mt);
    return hr;

我修改成这样后buffer数据还是不对,我用IPicture无法正确取到图,错误就是buffer数据没有还原出位图格式来
---华软网友回复---
别沉了,大家帮帮忙呀
---华软网友回复---
确认一下 (LPBITMAPINFOHEADER)pBuffer可以看到有效DIB图象数据,如果数据正确,那么应该是可以还原的。
---华软网友回复---
我调式的时候看了下
lpbi的value有值的呢
---华软网友回复---
memcpy(newbuffer + sizeof(BITMAPFILEHEADER), pBuffer, newbitmapSize);
这句大小拷错了。
pBuffer的大小怎么会是newbitmapSize呢?
pBuffer是从GetCurrentBuffer得到的,大小应该是bmSize
---华软网友回复---
我修改了,可是还是不行呢,到IPicture的
if(OleLoadPicture(m_pStream,0,FALSE,IID_IPicture,(LPVOID*)&(m_pPicture)) == S_OK)
这里就会过不去,可是我的IPicture方法原先能用的呀,现在就是换了个buffer就不行了
---华软网友回复---
long *pBuffer=new long [bmSize];

这里不能用long 呢,不然new 出来的内存不连续

后面
memcpy(newbuffer + sizeof(BITMAPFILEHEADER), pBuffer, newbitmapSize);//这个newbitmapSize确实错了,改成bmpsize

这样拷贝的时候,不连续的buffer拷贝就出错了。
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。