Parsing Windows Bitmap header information
First of all, don't use underscores in fields names. Fields like header_size, pixel_width and so on should be renamed to headerSize, pixelWidth. You should use camelCase for private fields, parameters and local variables. Also don't shorten parameters. Use binaryReader instead of br.

All methods in C# should be PascalCased. It means you should change show to Show.



I'm personally not a fan of passing streams and readers in constructors to initialize an instance of some class. In my opinion constructor should be as simple as possible, without reading from streams and heavy calculations. Ideally it should take only parameters that will be stored to fields or properties.

In you case I would change this code:


public BMPFileHeader(BinaryReader br)
{
    br.BaseStream.Seek(0, SeekOrigin.Begin);
    header_field[0] = br.ReadChar();//1
    header_field[1] = br.ReadChar();//2
    file_byte_size = br.ReadUInt32();//6
    br.ReadUInt16();//8
    br.ReadUInt16();//10
    pixel_start = br.ReadUInt32();//14
}



to

private const int HeaderFieldSize = 2;

private char[] _headerField = new char[HeaderFieldSize];
private uint _fileByteSize;
private uint _pixelStart;

public BMPFileHeader(char[] headerField, uint fileByteSize, uint pixelStart)
{
    _headerField = headerField;
    _fileByteSize = fileByteSize;
    _pixelStart = pixelStart;
}

public static BMPFileHeader Read(BinaryReader binaryReader)
{
    binaryReader.BaseStream.Seek(0, SeekOrigin.Begin);

    var headerField = binaryReader.ReadChars(HeaderFieldSize);
    var fileByteSize = binaryReader.ReadUInt32(); // 6

    binaryReader.ReadUInt16(); // 8
    binaryReader.ReadUInt16(); // 10

    var pixelStart = binaryReader.ReadUInt32(); // 14

    return new BMPFileHeader(headerField, fileByteSize, pixelStart);
}


And the same approach I would apply in BMPHeaderReader.



Instead of this code:


Console.WriteLine("Header size");
Console.WriteLine(header_size);
Console.WriteLine("Pixel Width");
Console.WriteLine(pixel_width);
Console.WriteLine("Pixel Height");
Console.WriteLine(pixel_height);
Console.WriteLine("Pixel Depth");
Console.WriteLine(pixel_depth);
Console.WriteLine("Pixels");
Console.WriteLine(pixels);
Console.WriteLine("Row size");
Console.WriteLine(row_size);
Console.WriteLine("Padding bits");
Console.WriteLine(padding_bits);
Console.WriteLine("Padding bytes");
Console.WriteLine(padding_bytes);



you can write

Console.WriteLine(string.Join(Environment.NewLine,
                              new object[]
                              {
                                  "Header size",   headerSize,
                                  "Pixel Width",   pixelWidth,
                                  "Pixel Height",  pixelHeight,
                                  "Pixel Depth",   pixelDepth,
                                  "Pixels",        pixels,
                                  "Row size",      rowSize,
                                  "Padding bits",  paddingBits,
                                  "Padding bytes", paddingBytes
                              });