How to display a PGM image in Visual C++

I have a problem of diplaying PGM format image under Visual C++ program. wondering how to make my program display them?
Who is Participating?
paynConnect With a Mentor Commented:
There are two separate problems involved in displaying new file formats in Windows: Reading the file, and displaying the picture.

First, for reading and parsing a PGM file, there's plenty of open-source code out there to handle that part. Look in the various Unix image viewers (xv at, xli at, etc.), or in the IJG JPEG tools distribution at

Actually, PGM is so simple you might want to write your own parsing code. Here's some pseudocode. This assumes you have a routine GetNextWord() that skips any whitespace and comment lines, then returns a CString holding the next characters from the PGM file up to but not including the first whitespace, and a routine GetNextByte() that just returns the next byte no matter what it is.

struct GreyMap {
  char** map;
  int nWidth, nHeight;

GreyMap ReadPGM(const char* szFilename)
  GreyMap gm = { NULL, 0, 0 };
  bool bRaw = false;

  // The idea of PrepareFile is that it opens the file and sets
  // up GetNextWord to deal with it.
  if (!PrepareFile(szFilename)) error;

  // Read the header
  CString strFormat = GetNextWord();
  if (strFormat == "P5") bRaw = true;
  else if (GetNextWord() != "P2") error;
  gm.nWidth = atoi(GetNextWord());
  gm.nHeight = atoi(GetNextWord());
  int nMaxValue = atoi(GetNextWord());
  // ReadPGM32 and ReadPGM16 are very similar, but they read 16-
  // and 32-bit PGMs. You can decide whether to keep this data,
  // or throw it away (by multiplying each read value by
  // nMaxValue/255, or just right-shifting away extra bits).
  // Also note that raw PGMs (P5 format) cannot be greater than
  // 8 bits.
  if (nMaxValue >= 2<<16) return ReadPGM32(szFilename)
  if (nMaxValue >= 2<<8) return ReadPGM16(szFilename) = new unsigned char[nWidth][nHeight];
  // Read in the pixel data
  if (bRaw)
    for (int y = 0; y != gm.nHeight; y++)
      for (int x = 0; x != gm.nWidth; x++)[x][y] = GetNextByte();
    for (int y = 0; y != gm.nHeight; y++)
      for (int x = 0; x != gm.nWidth; x++)[x][y] = atoi(GetNextWord());

  // Clean up and return
  return gm;

The next step is displaying your image. Basically, you're going to wait to stick your raw data into a Windows bitmap and just draw that bitmap. Look at Julian Smart's CImage library (available on CodeGuru, for a good idea of how to do this, or ask here for more help.

Where exactly are you having a problem?

Is it the pgm file format?
If so have a look at:
You should find there a description of the pgm file format (search for

Or is it Windows related?

nigelcctAuthor Commented:
Yes , it is the pgm file (image). But the web site only show the format of the file but never show how i can display in my Visual C++ ver 5 program. I wish to the image file in one of the window when I click a button.

thanks for you info but wonder if you can help me further?
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.