lib/analyzer/image_analyzer.ex

# Extracts width and height in pixels from an image blob.
#
# If the image contains EXIF data indicating its angle is 90 or 270 degrees, its width and height are swapped for convenience.
#
# Example:
#
#   ActiveStorage::Analyzer::ImageAnalyzer.new(blob).metadata
#   # => { width: 4104, height: 2736 }
#
# This analyzer relies on the third-party {MiniMagick}[https://github.com/minimagick/minimagick] gem. MiniMagick requires
# the {ImageMagick}[http://www.imagemagick.org] system library.
defmodule ActiveStorage.Analyzer.ImageAnalyzer do
  def accept?(blob) do
    blob.image?
  end

  def metadata(_blob) do
    # read_image do |image|
    #   if rotated_image?(image)
    #     { width: image.height, height: image.width }
    #   else
    #     { width: image.width, height: image.height }
    #   end
    # end
  end

  def read_image(_blob) do
    #  download_blob_to_tempfile do |file|
    #    require "mini_magick"
    #    image = MiniMagick::Image.new(file.path)

    #    if image.valid?
    #      yield image
    #    else
    #      logger.info "Skipping image analysis because ImageMagick doesn't support the file"
    #      {}
    #    end
    #  end
    # rescue LoadError
    #  logger.info "Skipping image analysis because the mini_magick gem isn't installed"
    #  {}
    # rescue MiniMagick::Error => error
    #  logger.error "Skipping image analysis due to an ImageMagick error: #{error.message}"
    #  {}
  end

  def rotated_image?(image) do
    ["RightTop", "LeftBottom"] |> Enum.member?(image["%[orientation]"])
  end
end