BOOL ImageDib::ReadPGM(LPCTSTR lpszPathName)
{
//pgm文件头信息
char *fStream;
int arg[4];
//读模式打开图像文件
CFile file;
int i,j,start;
int tempnum;
char countarg;
if (!file.Open(lpszPathName, CFile::modeRead |
CFile::shareDenyWrite))
return FALSE;
//读取文件类型
fStream = new char[file.GetLength()];
file.Read(fStream,file.GetLength());
countarg = 0;
tempnum = 0;
for(i = 0; i < (int)file.GetLength();
i++)
{
//临时保存参数
if(fStream[i] >= '0'
&& fStream[i] <=
'9')
tempnum = tempnum * 10 + fStream[i] - '0';
//判断是否又是一个新参数的开始
if( (fStream[i] ==
'\n')
|| (fStream[i] == '\t')
|| (fStream[i] == ' ')
|| (fStream[i] == 0x09))
{
arg[countarg] = tempnum;
tempnum = 0;
countarg++;
}
//记录参数是否记录结束
if(countarg == 4)
break;
}
start = i + 1;
if(arg[0] == 5)//P5格式
{
//为成员变量赋值
m_imgWidth = arg[1];
m_imgHeight = arg[2];
m_nBitCount = 24;
int linebyte = (arg[1] * m_nBitCount / 8 + 3) / 4 *
4;//每行字节数
int pixelbyte = m_nBitCount / 8;
//为m_lpDib分配空间,设置DIB内容
if(m_lpDib!=NULL) delete []m_lpDib;
m_lpDib=new BYTE[40 + linebyte * m_imgHeight];
//m_lpBmpInfoHead位置为m_lpDib起始位置
m_lpBmpInfoHead = (LPBITMAPINFOHEADER)m_lpDib;
//m_lpBmpInfoHead初始化
m_lpBmpInfoHead->biSize = 40; //
本结构所占用字节数,长度40字节
m_lpBmpInfoHead->biWidth = m_imgWidth;//
位图的宽度,以像素为单位
m_lpBmpInfoHead->biHeight = m_imgHeight;//
位图的高度,以像素为单位
m_lpBmpInfoHead->biPlanes = 1;//
目标设备的级别,必须为1
m_lpBmpInfoHead->biBitCount =
m_nBitCount;//图像每像素宽度(单位:位)
m_lpBmpInfoHead->biCompression = 0;
m_lpBmpInfoHead->biSizeImage = linebyte
* m_lpBmpInfoHead->biHeight;//
位图的大小,以字节为单位
//计算颜色表长度
m_nColorTableLength=ComputeColorTableLength(m_nBitCount);
//如果有颜色表,则创建逻辑调色板,申请颜色表缓冲区,生成灰度图像的颜色表
m_hPalette = NULL;
if(m_nColorTableLength != 0)
{
m_lpColorTable = new RGBQUAD[m_nColorTableLength];
if(m_lpColorTable == NULL)
_Error("m_lpColorTable new failed!!");
for(int i = 0; i < m_nColorTableLength;
i++)
{
m_lpColorTable[i].rgbBlue = i;
m_lpColorTable[i].rgbGreen = i;
m_lpColorTable[i].rgbRed = i;
m_lpColorTable[i].rgbReserved = 0;
}
}
//m_pImgData指向DIB的位图数据起始位置
m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength;
//拷贝文件流数据至BMP数据区指针
for(i = m_imgHeight - 1; i >= 0; i--)
{
for(j = 0; j < m_imgWidth; j++)
{
m_pImgData[i * linebyte + j * pixelbyte + 0] =
fStream[start];
m_pImgData[i * linebyte + j * pixelbyte + 1] =
fStream[start];
m_pImgData[i * linebyte + j * pixelbyte + 2] =
fStream[start];
start++;
}
}
//释放文件流指针
file.Close();
delete fStream;
fStream = NULL;
}
else//P2格式
{
}
return TRUE;
}