docs: def _fromfile(self, parent):
          """Read tag structure from open file. Advance file cursor."""
          fd = parent._fd
          byte_order = parent.byte_order
  
          self._offset = fd.tell()
          self.value_offset = self._offset + parent.offset_size + 4
  
          fmt, size = {4: ('HHI4s', 12), 8: ('HHQ8s', 20)}[parent.offset_size]
          data = fd.read(size)
          code, dtype = struct.unpack(byte_order + fmt[:2], data[:4])
          count, value = struct.unpack(byte_order + fmt[2:], data[4:])
  
          if code in TIFF_TAGS:
              name = TIFF_TAGS[code][0]
          elif code in CUSTOM_TAGS:
              name = CUSTOM_TAGS[code][0]
          else:
              name = str(code)
  
          try:
              dtype = TIFF_DATA_TYPES[dtype]
          except KeyError:
              raise ValueError("unknown TIFF tag data type %i" % dtype)
  
          fmt = '%s%i%s' % (byte_order, count*int(dtype[0]), dtype[1])
          size = struct.calcsize(fmt)
          if size > parent.offset_size or code in CUSTOM_TAGS:
              pos = fd.tell()
              tof = {4: 'I', 8: 'Q'}[parent.offset_size]
              self.value_offset = struct.unpack(byte_order+tof, value)[0]
              fd.seek(self.value_offset)
              if code in CUSTOM_TAGS:
                  readfunc = CUSTOM_TAGS[code][1]
                  value = readfunc(fd, byte_order, dtype, count)
                  fd.seek(0, 2)  # bug in numpy/Python 3.x ?
                  if isinstance(value, dict):  # numpy.core.records.record
                      value = Record(value)
              elif code in TIFF_TAGS or dtype[-1] == 's':
                  value = struct.unpack(fmt, fd.read(size))
              else:
                  value = read_numpy(fd, byte_order, dtype, count)
                  fd.seek(0, 2)  # bug in numpy/Python 3.x ?
              fd.seek(pos)
          else:
              value = struct.unpack(fmt, value[:size])
  
          if not code in CUSTOM_TAGS:
              if len(value) == 1:
                  value = value[0]
  
          if dtype.endswith('s'):
              value = stripnull(value)
  
          self.code = code
          self.name = name
          self.dtype = dtype
          self.count = count
          self.value = value