视觉开发时用到的相机原始数据大部分都是以指针的形式存在,在使用之往往需要确保图像是否正确,通过下面的函数可以直接保存图像。
实现如:(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_DEBUG
HANDLE 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);
#endif
return TRUE;
}
另外,也可以通过OpenCV的Mat进行构造,转换为我们熟悉的Mat类型图像。如:
Mat a;
a=Mat(Height,Width,CV_8UC1,p_Image,Width).clone;//p_Imag为指针图像数据