mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
45 lines
1.3 KiB
Ruby
45 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module ActiveStorage
|
|
# 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.
|
|
class Analyzer::ImageAnalyzer < Analyzer
|
|
def self.accept?(blob)
|
|
blob.image?
|
|
end
|
|
|
|
def metadata
|
|
read_image do |image|
|
|
if rotated_image?(image)
|
|
{ width: image.height, height: image.width }
|
|
else
|
|
{ width: image.width, height: image.height }
|
|
end
|
|
end
|
|
rescue LoadError
|
|
logger.info "Skipping image analysis because the mini_magick gem isn't installed"
|
|
{}
|
|
end
|
|
|
|
private
|
|
def read_image
|
|
download_blob_to_tempfile do |file|
|
|
require "mini_magick"
|
|
yield MiniMagick::Image.new(file.path)
|
|
end
|
|
end
|
|
|
|
def rotated_image?(image)
|
|
%w[ RightTop LeftBottom ].include?(image["%[orientation]"])
|
|
end
|
|
end
|
|
end
|