private PNMImageInfo ReadHeader(Stream stream)
{
// read magic word
byte magic1 = (byte)stream.ReadByte();
byte magic2 = (byte)stream.ReadByte();
// check if it is valid PNM image
if ((magic1 != 'P') || (magic2 < '1') || (magic2 > '6'))
{
throw new FormatException("The stream does not contain PNM image.");
}
// check if it is P5 or P6 format
if ((magic2 != '5') && (magic2 != '6'))
{
throw new NotSupportedException("Format is not supported yet. Only P5 and P6 are supported for now.");
}
int width = 0, height = 0, maxValue = 0;
try
{
// read image's width and height
width = ReadIntegerValue(stream);
height = ReadIntegerValue(stream);
// read pixel's highiest value
maxValue = ReadIntegerValue(stream);
}
catch
{
throw new ArgumentException("The stream does not contain valid PNM image.");
}
// check if all attributes are valid
if ((width <= 0) || (height <= 0) || (maxValue <= 0))
{
throw new ArgumentException("The stream does not contain valid PNM image.");
}
// check maximum pixel's value
if (maxValue > 255)
{
throw new NotSupportedException("255 is the maximum pixel's value, which is supported for now.");
}
// prepare image information
PNMImageInfo imageInfo = new PNMImageInfo(width, height, (magic2 == '5') ? 8 : 24, 0, 1);
imageInfo.Version = (int)(magic2 - '0');
imageInfo.MaxDataValue = maxValue;
return imageInfo;
}