一个512×512的彩色图像,已经解码出来了,RGB分别放在三个数组中channel[0]、channel[1]、channel[2]中,如何保存为bmp格式文件?

解决方案 »

  1.   

    http://it.sohu.com/2004/03/15/78/article219447801.shtml
      

  2.   

    用OpenCV很容易做//channel[0]、channel[1]、channel[2] 分别是usnigned char类型的,长度为512 * 512的数组const int nWidth = 512;
    const int nHeight = 512;
    IplImage* pImg = cvCreateImage(cvSize(nWidth, nHeight), IPL_DEPTH_8U, 3);
    int nCount = 0;
    for(int i = 0; i < nHeight; i++)
    {
    for(int j = 0; j < nWidth; j++)
    {
    unsigned char* pData = (unsigned char*)(pImg->imageData + j * pImg->widthStep + i * pImg->nChannels * sizeof(unsigned char));
    //OpenCV中RGB的排列顺序是BGR
    pData[2] = channel[0][nCount]; //R
    pData[1] = channel[1][nCount]; //G
    pData[0] = channel[2][nCount]; //B
    nCount++;
    }
    }cvSaveImage("BMPImage.bmp");
      

  3.   

    首先要知道bmp位图格式
    1.文件头
    2.文件信息头
    3.调色版
    4.图像数据从楼主的数据看来,应该是24位的吧
    那没必要用到调色板BITMAPFILEHEADER bf; //位图文件头
    BITMAPINFOHEADER bi; //位图信息头
    BYTE *lpBuf;         //位图数据
    int nWidth = 512; //位图宽
    int nHeight = 512; //位图高
    //BMP文件信息头
    bi.biSize = 40;
    bi.biWidth = nWidth;
    bi.biHeight = nHeight;
    bi.biPlanes = 1;
    bi.biBitCount = 24;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = (nWidth*24 +31)/32*4*nHeight;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0;//为图像数据申请空间
    lpBuf = (BYTE*)malloc( sizeof(BYTE) * bi.biSizeImage );//BMP文件头
    bf.bfType = 0x4d42;
    bf.bfSize = 14 + 40 + bi.biSizeImage;
    bf.bfReserved1 = 0;
    bf.bfReserved2 = 0;
    bf.bfOffBits = 14 + 40;CFile file;
    file.Open("C://bmp.bmp", CFile::Create|CFile::Write);
    file.Write((void*)&bf, sizeof(BITMAPFILEHEADER));
    file.Write((void*)&bi, sizeof(BITMAPINFOHEADER));
    file.Write((void*)lpBuf, sizeof(BYTE) * bi.biSizeImage);
    file.Close();以上代码没上机测试过.这只是方法