/*================================================================= * GetBmpData.cpp * * This mex-file is used to read pixel data from bmp file directly * from bitmap file. * * This is a MEX-file for MATLAB. * Created by visionfans @ 2011.06.16 *=================================================================*/ #include <stdio.h> #include <string.h> #include <windows.h> #include "mex.h" BYTE Bit2Byte(BYTE *pData,int iRow,int iCol,int nRowWidth); void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { // // read bmp file // char* bmpPath = mxArrayToString(prhs[0]); FILE* pFile = fopen( bmpPath, "rb" ); if ( pFile == NULL ) { mexWarnMsgTxt( "Open File Error/n" ); } // get file size fseek( pFile, 0L, SEEK_END ); DWORD fileSize = ftell( pFile ); // read the entire file BYTE* pData = new BYTE[fileSize]; ZeroMemory(pData,fileSize); fseek( pFile, 0L, SEEK_SET ); fread( pData,1,fileSize,pFile); // // get the image matrix from bmp file // BITMAPFILEHEADER Bfh; // file header LPBITMAPINFO lpBmi; // bitmap info int BmiSize; // // get bmp image information // memcpy(&Bfh,pData,sizeof(BITMAPFILEHEADER)); BmiSize = Bfh.bfOffBits - sizeof(BITMAPFILEHEADER); lpBmi = (LPBITMAPINFO) malloc(BmiSize); memcpy(lpBmi,pData+sizeof(BITMAPFILEHEADER),BmiSize); // // get image data // int nWidth = lpBmi->bmiHeader.biWidth; int nHeight = lpBmi->bmiHeader.biHeight; int bits = lpBmi->bmiHeader.biBitCount; // point to image data BYTE* pImgData = pData + Bfh.bfOffBits; // // copy all bit data to byte data // BYTE* pOutData = (BYTE *)mxCalloc(nWidth*nHeight,sizeof(BYTE)); // copy data int nRowWidth = ((bits*nWidth + 31)>> 5)<<2; int arrayIdx = 0; for (int j=0;j<nWidth;j++) { for (int i=0;i<nHeight;i++) { pOutData[arrayIdx++] = Bit2Byte(pImgData,i,j,nRowWidth); } } // // create output matrix and set data // int ndims = 2; int dims[] = {nHeight,nWidth}; plhs[0] = mxCreateNumericArray(ndims,dims,mxUINT8_CLASS,mxREAL); mxSetData(plhs[0],pOutData); fclose(pFile); delete pData; } BYTE Bit2Byte(BYTE *pData,int iRow,int iCol,int nRowWidth) { BYTE byPixel = 0; // get byte index int iByteIdx = iCol / 8; // get bit index int iBitIdx = iCol % 8; // get pixel value @ [iRow, iCol] BYTE bitshift = pData[iRow*nRowWidth + iByteIdx] >> (7-iBitIdx); byPixel = bitshift & 1; return byPixel; }