指针形式的图像的保存与转换

来源:互联网 发布:化为简化阶梯型矩阵 编辑:程序博客网 时间:2024/04/19 19:45

视觉开发时用到的相机原始数据大部分都是以指针的形式存在,在使用之往往需要确保图像是否正确,通过下面的函数可以直接保存图像。

实现如:(MFC下)

bool SaveGrayImage(LPCTSTR fileName,BYTE* pImageData,int nWidth,int nHeight);//声明
SaveGrayImage(_T("1.bmp"),pImage,Width,Height);

bool SaveGrayImage(LPCTSTR fileName,BYTE* pImageData,int nWidth,int nHeight){#ifdef MY_DEBUGHANDLE fh;    DWORD   dwWritten=0;  BYTE* pDest = NULL;if(fileName == NULL || nWidth < 1 || nHeight < 1)return FALSE;fh = CreateFile(fileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);  if(fh == INVALID_HANDLE_VALUE)   return  FALSE;    BITMAPFILEHEADER BFH;memset(&BFH,0,sizeof(BITMAPFILEHEADER));//写入位图文件头BFH.bfType = 0x4d42;BFH.bfSize = 0;BFH.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);BFH.bfReserved1 = 0;BFH.bfReserved2 = 0;WriteFile(fh,(char*)&BFH,sizeof(BITMAPFILEHEADER), &dwWritten, NULL);//写入位图信息头BITMAPINFO *pBInfo;pBInfo = (BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];pBInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);pBInfo->bmiHeader.biWidth = nWidth;pBInfo->bmiHeader.biHeight = -nHeight;pBInfo->bmiHeader.biPlanes = 1;pBInfo->bmiHeader.biBitCount = 8;pBInfo->bmiHeader.biCompression = BI_RGB;pBInfo->bmiHeader.biSizeImage = 0;pBInfo->bmiHeader.biXPelsPerMeter = 0;pBInfo->bmiHeader.biYPelsPerMeter = 0;pBInfo->bmiHeader.biClrUsed = 0;pBInfo->bmiHeader.biClrImportant = 0;//写入位图颜色表for (int i=0;i<256;++i){pBInfo->bmiColors[i].rgbBlue = i;pBInfo->bmiColors[i].rgbGreen = i;pBInfo->bmiColors[i].rgbRed = i;pBInfo->bmiColors[i].rgbReserved = 0;}WriteFile(fh,pBInfo,sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD),&dwWritten, NULL); delete[] pBInfo;    //  写入位图文件其余内容 if(nWidth&0x3){int width = (nWidth+3)/4*4;int k=0;pDest = new BYTE[width*nHeight];memset(pDest,255,width*nHeight);for(int i=0;i<nHeight;i++){for(int j=0;j<nWidth;j++){pDest[i*width+j] = pImageData[k++];//pImageData[i*nWidth+j];}}WriteFile(fh, pDest, width*nHeight, &dwWritten, NULL);   delete[] pDest;}else//32位对齐{WriteFile(fh, pImageData, nWidth*nHeight, &dwWritten, NULL);   }    CloseHandle(fh);    #endifreturn TRUE;}

另外,也可以通过OpenCV的Mat进行构造,转换为我们熟悉的Mat类型图像。如:

Mat a;a=Mat(Height,Width,CV_8UC1,p_Image,Width).clone;//p_Imag为指针图像数据


原创粉丝点击