今天在做训练图片读取的时候,需要读取PGM图片。经过一番努力寻找,发现网上可以读取PGM图片的图片浏览器空缺,而且可以正常读取的还需要收费。所以上传自己写的PGM图片转成24BitBMP图片的代码供网友参考!
- BOOL ImageDib::ReadPGM(LPCTSTR lpszPathName)
- {
-
- 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)
- {
-
- 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;
-
- if(m_lpDib!=NULL) delete []m_lpDib;
- m_lpDib=new BYTE[40 + linebyte * m_imgHeight];
-
- m_lpBmpInfoHead = (LPBITMAPINFOHEADER)m_lpDib;
-
- m_lpBmpInfoHead->biSize = 40;
- m_lpBmpInfoHead->biWidth = m_imgWidth;
- m_lpBmpInfoHead->biHeight = m_imgHeight;
- m_lpBmpInfoHead->biPlanes = 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 = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER) +
- sizeof(RGBQUAD) * m_nColorTableLength;
-
- 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
- {
- }
- return TRUE;
- }
(陈修) |