code: def parse(cls, fptr, offset, length):
          
          num_bytes = offset + length - fptr.tell()
          read_buffer = fptr.read(num_bytes)
          nrows, ncols = struct.unpack_from('>HB', read_buffer, offset=0)
  
          bps_signed = struct.unpack_from('>' + 'B' * ncols, read_buffer,
                                          offset=3)
          bps = [((x & 0x7f) + 1) for x in bps_signed]
          signed = [((x & 0x80) > 1) for x in bps_signed]
  
          # Are any components signed or differently sized?  We don't handle
          # that.
          if any(signed) or len(set(bps)) != 1:
              msg = ("Palettes with signed components or differently sized "
                     "components are not supported.")
              raise IOError(msg)
  
          # The palette is unsigned and all components have the same width.
          # This should cover all but a vanishingly small share of palettes.
          b = bps[0]
          dtype = np.uint8 if b <=8 else np.uint16 if b <= 16 else np.uint32
  
          palette = np.frombuffer(read_buffer[3 + ncols:], dtype=dtype)
          palette = np.reshape(palette, (nrows, ncols))
  
          return cls(palette, bps, signed, length=length, offset=offset)
docs: Parse palette box.
  
          Parameters
          ----------
          fptr : file
              Open file object.
          offset : int
              Start position of box in bytes.
          length : int
              Length of the box in bytes.
  
          Returns
          -------
          PaletteBox
              Instance of the current palette box.