请教:
BOOL CCaptureVideo::SaveBitmap(BYTE * pBuffer, long lBufferSize )
   {
  HANDLE hf = CreateFile(
  m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
  CREATE_ALWAYS, NULL, NULL );
  if( hf == INVALID_HANDLE_VALUE ) return 0;
    // 写文件头 
    BITMAPFILEHEADER bfh;
    memset( &bfh, 0, sizeof( bfh ) );
    bfh.bfType = 'MB';
    bfh.bfSize = sizeof( bfh ) + lBufferSize + sizeof( BITMAPINFOHEADER );
    bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );
    DWORD dwWritten = 0;
    WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );
    // 写位图格式
    BITMAPINFOHEADER bih;
    memset( &bih, 0, sizeof( bih ) );
    bih.biSize = sizeof( bih );
   // bih.biWidth = lWidth;
   // bih.biHeight = lHeight;
    bih.biWidth = 281;     //自己硬写的
    bih.biHeight = 234;    //自己硬写的
    bih.biPlanes = 1;
    bih.biBitCount = 32;
    WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );
    // 写位图数据
    WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );
    CloseHandle( hf );
    return 0;
  }
  
  
 在程序中:
 从摄像头取得数据 buffer0
 我这样调用 SaveBitmap(buffer0, 281*234*4);
 如果介质是硬盘,那么可以生成清晰的 .bmp 图片,
 
 如果介质为 CF 卡,则生成的 .bmp 很模糊,
 
 各位大哥,这要怎么处理?我们使用的介质是 CF 卡 啊!
 
 是不是我这个生成图片的函数不行?
 
 还是别的原因?
 
 谢谢!

解决方案 »

  1.   

    给你份代码实例吧:
    class CDIB : public CObject
    {
    public: unsigned char* m_pDib;          //从文件中BITMAPINFOHEADER开始直到最后的数据
            unsigned char* m_pDibBits;      //包含像素数组数据
    DWORD m_pSize;                  //文件中除去BITMAPFILEHEADER外的长度
    int m_PaletteEntry;             //调色板中颜色表个数
    CPalette m_Pal;
    BITMAPINFOHEADER* m_pBIH;
    RGBQUAD* m_pRQ;                 //BITMAPINFO结构中的颜色表 CDIB(); BOOL LoadDIB(const char* lpszFileName);     //加载DIB文件
    BOOL SaveDIB(const char* lpszFileName);     //保存DIB文件
    BOOL Draw(CDC* pDC,int x,int y,int width,int height);       //在指定设备的指定范围内绘制DIB
    BOOL SetPalette(CDC* pDC);      //应用逻辑调色板 virtual ~CDIB();
    };cpp文件实现体为:
    CDIB::CDIB()
    {
    m_pDib=NULL;
    }CDIB::~CDIB()
    {
    if(m_pDib!=NULL)
    delete[] m_pDib;
    }
    // CDIB 成员函数BOOL CDIB::LoadDIB(const char *lpszFileName)
    {
    CFile file;
    if(!file.Open(CString(lpszFileName),CFile::modeRead))
       return FALSE;
        
    BITMAPFILEHEADER BFH;
    DWORD dwSize=(DWORD)(file.GetLength()-sizeof(BITMAPFILEHEADER));
        
    unsigned char* pDib=new unsigned char[dwSize];
    try
    {

    if(file.Read(&BFH,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER)
    || BFH.bfType!='MB'
    || file.Read(pDib,dwSize)!=dwSize) //如果指定的文件并不是一个合法的DIB

    {

    delete[] pDib;
    return FALSE;


    }
    }
    catch(CFileException* e)
    {
    e->Delete();
    delete[] pDib;
    return FALSE;
    } if(m_pDib!=NULL)
    delete m_pDib;            //在读数据之前,先清空原始位图数据 this->m_pSize=dwSize;
    this->m_pDib=pDib; this->m_pBIH=(BITMAPINFOHEADER*)m_pDib;             //m_pDib所指的结构就是BITMAPINFOHEADER
    this->m_pRQ=(RGBQUAD*)&m_pDib[sizeof(BITMAPINFOHEADER)];   //将指针向后移动sizeof(BITMAPINFOHEADER)的长度,那么它指向了颜色表 int count=1<<m_pBIH->biBitCount;         //计算位图颜色深度
    m_PaletteEntry=count;
    if(m_pBIH->biBitCount>8)
    {
    m_PaletteEntry=0;
    }
    else if(m_pBIH->biClrUsed!=0)
    {
    m_PaletteEntry=m_pBIH->biClrUsed;
    } if(m_Pal.GetSafeHandle()!=NULL)
    this->m_Pal.DeleteObject();      //在设置调色板前,将其句柄清空    m_pDibBits=&m_pDib[sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*m_PaletteEntry];//将指针向后移动sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*m_PaletteEntry的长度,那么它指向了像素的数组
    if(m_PaletteEntry>0)         //如果位图使用了调色板,则需要设置调色板
    {
    LPLOGPALETTE lpLogPal;
    lpLogPal=(LPLOGPALETTE)malloc(sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*m_PaletteEntry);
    lpLogPal->palVersion=0x300;
    lpLogPal->palNumEntries=m_PaletteEntry;
    for(int i=0;i<m_PaletteEntry;i++)
    {
    lpLogPal->palPalEntry[i].peBlue=m_pRQ[i].rgbBlue;
    lpLogPal->palPalEntry[i].peGreen=m_pRQ[i].rgbGreen;
    lpLogPal->palPalEntry[i].peRed=m_pRQ[i].rgbRed;

    }
    m_Pal.CreatePalette(lpLogPal);
    delete[] lpLogPal;
    }
    return TRUE;}BOOL CDIB::SaveDIB(const char *lpszFileName)
    {
       if(m_pDib==NULL)             //如果位图数据为空,则退出
       return FALSE;   CFile file;
       if(!file.Open(CString(lpszFileName),CFile::modeWrite|CFile::modeCreate))//如果文件路径非法,则退出
       return FALSE;
       try
       {
       BITMAPFILEHEADER bfh;
       memset(&bfh,0,sizeof(BITMAPFILEHEADER));
       bfh.bfReserved1=0;
       bfh.bfReserved2=0;
       bfh.bfSize=sizeof(BITMAPFILEHEADER)+m_pSize;  //赋值图片文件的尺寸
       bfh.bfOffBits=sizeof(BITMAPFILEHEADER)+m_PaletteEntry*sizeof(RGBQUAD)+sizeof(BITMAPINFOHEADER);//赋予文件头到像素数组之间的偏移量
       bfh.bfType='MB';
       file.Write(&bfh,sizeof(BITMAPFILEHEADER));//写入BITMAPFILEHEADER结构
       file.Write(m_pDib,m_pSize);               //写入BITMAPINFOHEADER+颜色表+像素数据   }
       catch(CFileException* e)
       {
       e->Delete();
       return FALSE;
       }
       return TRUE;
    }BOOL CDIB::Draw(CDC *pDC, int x, int y, int width, int height)
    {
    if(m_pDib==NULL)              //如果图片没有数据,则退出
    return FALSE;             if(width<=0)                  //将图片的尺寸纠正到合法数值
    width=m_pBIH->biWidth;
    if(height<=0)
    height=m_pBIH->biHeight; ::StretchDIBits(pDC->GetSafeHdc(),x,y,    //伸缩DIB位图,用于绘制到目标设备
    width,height,
    0,0,
    m_pBIH->biWidth,m_pBIH->biHeight,
    m_pDibBits,
    (BITMAPINFO*)m_pBIH,
    BI_RGB,
    SRCCOPY);
    return TRUE;
       
    }BOOL CDIB::SetPalette(CDC *pDC)
    {
    if(m_pDib==NULL)               //如果图片没有数据,则退出
    return FALSE; if(m_Pal.GetSafeHandle()==NULL)          //如果不存在图片,或者图片不使用调色板,则退出
    return FALSE; CPalette* pOldPal=pDC->SelectPalette(&m_Pal,false);
    pDC->RealizePalette();
    pDC->SelectPalette(pOldPal,false);
    return TRUE;
    }