class FormatParser::TIFFParser

Constants

ARW_MIME_TYPE
HEADER_BYTES
MAGIC_BE
MAGIC_LE
TIFF_MIME_TYPE

Public Instance Methods

arw?(exif_data) click to toggle source

Similar to how exiftool determines the image type as ARW, we are implementing a check here github.com/exiftool/exiftool/blob/e969456372fbaf4b980fea8bb094d71033ac8bf7/lib/Image/ExifTool/Exif.pm#L929

# File lib/parsers/tiff_parser.rb, line 57
def arw?(exif_data)
  exif_data.compression == 6 && exif_data.new_subfile_type == 1 && exif_data.make == 'SONY'
end
call(io) click to toggle source
# File lib/parsers/tiff_parser.rb, line 15
def call(io)
  io = FormatParser::IOConstraint.new(io)

  return unless HEADER_BYTES.include?(safe_read(io, 4))

  # Skip over the offset of the IFD,
  # EXIFR will re-read it anyway
  io.seek(io.pos + 2)
  return if cr2?(io)

  # The TIFF scanner in EXIFR is plenty good enough,
  # so why don't we use it? It does all the right skips
  # in all the right places.
  exif_data = exif_from_tiff_io(io)
  return unless exif_data

  w = exif_data.width || exif_data.pixel_x_dimension
  h = exif_data.height || exif_data.pixel_y_dimension

  format = arw?(exif_data) ? :arw : :tif
  mime_type = arw?(exif_data) ? ARW_MIME_TYPE : TIFF_MIME_TYPE
  FormatParser::Image.new(
    format: format,
    width_px: w,
    height_px: h,
    display_width_px: exif_data.rotated? ? h : w,
    display_height_px: exif_data.rotated? ? w : h,
    orientation: exif_data.orientation_sym,
    intrinsics: {exif: exif_data},
    content_type: mime_type,
  )
rescue EXIFR::MalformedTIFF
  nil
end
cr2?(io) click to toggle source
# File lib/parsers/tiff_parser.rb, line 50
def cr2?(io)
  io.seek(8)
  safe_read(io, 2) == 'CR'
end
likely_match?(filename) click to toggle source
# File lib/parsers/tiff_parser.rb, line 11
def likely_match?(filename)
  filename =~ /\.tiff?$/i
end