程序(已附上)运行以后出现的现象是:图像能显示,但是,图像的颜色不对。原本灰色的图片,红的,绿的,蓝的,随机出现。这个效果和之前我没有写入颜色表的效果是一样的。图片的大小是129*129,我觉得在写入bmp图片文件的时候,出了点问题。不知道是不是这样。理由是:我之前用这个从多幅图片生成avi的代码,是可以生成avi视频的。但是对于这组图片就不能生成了。PS:这个程序老师要求不能用opencv,用mfc,vc++可以。嘿嘿,我刚学写程序,代码有点乱,还请大家见谅啊~
//生成图片的代码,图片是129*129
void CBmp_aviDlg::ImageShow(unsigned char *data, int Width, int Height, CString PathName)
{
    if (!data)
    {
        return ;
    }
    unsigned char *Mydata;
    //颜色表,设定为灰度图像
    int colorTablesize=1024;
    int widthStep=(Width+3)/4*4;
    //将数据重新排列成符合bmp规则的方式
    Mydata=new unsigned char[widthStep*Height];
    for (int i=0;i<Height;i++)
    {
        for (int j=0;j<Width;j++)
        {
            *(Mydata+i*widthStep+j)=*(data+i*Width+j);
        }
    }
    RGBQUAD pColorTable[256];
    //open a file to write bmp data
    FILE *fp=fopen(PathName,"wb");
    if (0==fp)
    {
        return;
    }
    //申请位图文件头信息,填写文件头信息
    BITMAPFILEHEADER fileHead;
    fileHead.bfType=0x4D42;
    
    fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize
        +widthStep*Height;
    fileHead.bfReserved1=0;
    fileHead.bfReserved2=0;
    
    //bfoffBits the begin 3 parts 
    fileHead.bfOffBits=54+colorTablesize;
    //write into file head
    fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);
    
    //申请位图信息头结构信息,填写信息头信息
    BITMAPINFOHEADER head;
    head.biBitCount=8;
    head.biClrImportant=0;
    head.biClrUsed=0;
    head.biCompression=0;
    head.biHeight=Height;
    head.biPlanes=1;
    head.biSize=40;
    head.biSizeImage=widthStep*Height;
    head.biWidth=Width;
    head.biXPelsPerMeter=0;
    head.biYPelsPerMeter=0;
    //写位图信息进内存
    fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);
    //构建颜色表,并写入
    for (i=0; i<256; i++)
    {
        pColorTable[i].rgbBlue=i;
        pColorTable[i].rgbGreen=i;
        pColorTable[i].rgbRed=i;
        pColorTable[i].rgbReserved=0;
    }
    
    fwrite(pColorTable,sizeof(RGBQUAD),256,fp);
    //write the data in file
    fwrite(Mydata,Height*widthStep,1,fp);
    fclose(fp);
    delete [] Mydata;
    return;
}//生成avi的代码,图片读取的路径已经设定好
//这段在测试时是可以成功运行的(用的从一个视频中截取的bmp图片),但是读由上面代码产生的图片却不行
bool CBmp_aviDlg::bmp_avi(CString aviName, CString bmpPath)
{
    CFileFind finder;
    //路径名
    //若调试中不能打开图片,在路径前面加上"."表示当前文件夹
    AVIFileInit(); 
    PAVIFILE pfile;
    PAVISTREAM ps; 
    BITMAPFILEHEADER bmpFileHdr;
    DWORD   dwSize ;
    LPBITMAPINFOHEADER pDib;
    HANDLE hdib;
    //压缩格式: 未压缩
    AVICOMPRESSOPTIONS strcm;
    strcm.cbFormat=0;
    strcm.cbParms=0;
    strcm.cbFormat=0;
    strcm.cbParms=0;
    strcm.dwBytesPerSecond=0;
    strcm.dwFlags=8;
    strcm.dwInterleaveEvery=0;
    strcm.dwKeyFrameEvery=0;
    strcm.dwQuality=0;
    strcm.fccHandler=COMPRESS_NOCOMPRESS;
    strcm.fccType=mmioFOURCC('V','I','D','C');
    strcm.lpFormat=NULL;
    strcm.lpParms=NULL;
    
    int nFrames =0; //frame number
    HRESULT hr; 
    //判断是否存在路径
    BOOL bFind = finder.FindFile(bmpPath);
    if (!bFind)
    {
        AfxMessageBox("don't exist bmp file");
        return false;
    }
    while(bFind)
    {
        bFind = finder.FindNextFile();//判断是否文件夹为空
        if(!finder.IsDots() && !finder.IsDirectory())//判断找到的文件不是当前目录or父目录
        {
            CString str = finder.GetFilePath();
            CFile bmpfile;
            // 打开文件
            if(bmpfile.Open(str,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
                return false;
            bmpfile.Read(&bmpFileHdr,sizeof(BITMAPFILEHEADER));
            dwSize=bmpFileHdr.bfSize-sizeof(BITMAPFILEHEADER);
            hdib=GlobalAlloc(GHND,dwSize);//分配内存
            pDib=(LPBITMAPINFOHEADER)GlobalLock(hdib);
            bmpfile.Read(pDib,dwSize);
            
            if(nFrames ==0 )
            {
                AVISTREAMINFO strhdr;
                //将要写入AVI文件的名字,不存在的就创建一个
                AVIFileOpen(&pfile,aviName , OF_WRITE | OF_CREATE , NULL);
                _fmemset(&strhdr, 0, sizeof(strhdr));//Sets buffers to a specified character
                //the function is similar to initial.
                strhdr.fccType = streamtypeVIDEO;// stream type
                strhdr.fccHandler = 0;
                strhdr.dwScale = 1;
                strhdr.dwRate = 20; // 15 fps
                strhdr.dwSuggestedBufferSize = pDib->biSizeImage ;
                SetRect(&strhdr.rcFrame, 0, 0, pDib->biWidth, pDib->biHeight);
                // And create the stream;
                hr = AVIFileCreateStream(pfile,&ps,&strhdr); 
                hr = AVIStreamSetFormat(ps,0,pDib,
                    pDib->biSize+pDib->biClrUsed*sizeof(RGBQUAD));
            }
            hr = AVIStreamWrite(ps, nFrames , 1, 
                (LPBYTE)pDib+pDib->biSize+pDib->biClrUsed*sizeof(RGBQUAD),
                pDib->biSizeImage, 
                AVIIF_KEYFRAME, 
                NULL,
                NULL);
            GlobalFreePtr(pDib);
            nFrames ++; 
        }
    }
    AVIStreamClose(ps);
    if(pfile != NULL)
        AVIFileRelease(pfile);
    AVIFileExit();
    return true;
}