def _extract_tif_tags_metadata()

in pathology/transformation_pipeline/ingestion_lib/dicom_gen/dicom_slide_coordinates_microscopic_image.py [0:0]


def _extract_tif_tags_metadata(tif_path: str) -> _TifTagsDicomMetadata:
  """Extracts TIF tags metadata relevant to VL Slide-Coordinates DICOM.

  Args:
    tif_path: Path to a TIF image.

  Returns:
    TIF tags metadata for VL Slide-Coordinates DICOM.
  """
  metadata = _TifTagsDicomMetadata()
  with tifffile.TiffFile(tif_path) as tif:
    if not tif.pages:
      cloud_logging_client.warning(f'TIF image missing pages: {tif_path}.')
      return metadata

    tags = tif.pages[0].tags

    if (
        _TIF_X_RESOLUTION_TAG in tags
        and _TIF_Y_RESOLUTION_TAG in tags
        and _TIF_RESOLUTION_UNIT_TAG in tags
    ):
      x_resolution = tags[_TIF_X_RESOLUTION_TAG].value
      y_resolution = tags[_TIF_Y_RESOLUTION_TAG].value
      resolution_unit = tags[_TIF_RESOLUTION_UNIT_TAG].value
      metadata.column_spacing = _convert_resolution_to_spacing(
          x_resolution, resolution_unit
      )
      metadata.row_spacing = _convert_resolution_to_spacing(
          y_resolution, resolution_unit
      )
      if not metadata.column_spacing or not metadata.row_spacing:
        cloud_logging_client.warning(
            f'Invalid resolution TIF tags in {tif_path}.'
        )

    if _TIF_DATE_TIME_TAG in tags:
      datetime_value = tags[_TIF_DATE_TIME_TAG].value
      try:
        metadata.acquisition_datetime = datetime.datetime.strptime(
            datetime_value, _TIF_DATE_TIME_FORMAT
        )
      except ValueError:
        cloud_logging_client.warning(
            f'Failed to parse acquisition datetime TIF tag in {tif_path}: '
            f'{datetime_value}.'
        )

  return metadata