Class: Paperclip::Thumbnail
- Defined in:
- lib/paperclip/thumbnail.rb
Overview
Handles thumbnailing images that are uploaded.
Constant Summary collapse
- ANIMATED_FORMATS =
List of formats that we need to preserve animation
%w(gif)
- MULTI_FRAME_FORMATS =
%w(.mkv .avi .mp4 .mov .mpg .mpeg .gif)
Instance Attribute Summary collapse
-
#animated ⇒ Object
Returns the value of attribute animated.
-
#auto_orient ⇒ Object
Returns the value of attribute auto_orient.
-
#convert_options ⇒ Object
Returns the value of attribute convert_options.
-
#current_geometry ⇒ Object
Returns the value of attribute current_geometry.
-
#format ⇒ Object
Returns the value of attribute format.
-
#frame_index ⇒ Object
Returns the value of attribute frame_index.
-
#source_file_options ⇒ Object
Returns the value of attribute source_file_options.
-
#target_geometry ⇒ Object
Returns the value of attribute target_geometry.
-
#whiny ⇒ Object
Returns the value of attribute whiny.
Attributes inherited from Processor
Instance Method Summary collapse
-
#convert_options? ⇒ Boolean
Returns true if the image is meant to make use of additional convert options.
-
#crop? ⇒ Boolean
Returns true if the
target_geometry
is meant to crop. -
#initialize(file, options = {}, attachment = nil) ⇒ Thumbnail
constructor
Creates a Thumbnail object set to work on the
file
given. -
#make ⇒ Object
Performs the conversion of the
file
into a thumbnail. -
#transformation_command ⇒ Object
Returns the command ImageMagick’s
convert
needs to transform the image into the thumbnail.
Methods inherited from Processor
Constructor Details
#initialize(file, options = {}, attachment = nil) ⇒ Thumbnail
Creates a Thumbnail object set to work on the file
given. It will attempt to transform the image into one defined by target_geometry
which is a “WxH”-style string. format
will be inferred from the file
unless specified. Thumbnail creation will raise no errors unless whiny
is true (which it is, by default. If convert_options
is set, the options will be appended to the convert command upon image conversion
Options include:
+geometry+ - the desired width and height of the thumbnail (required)
+file_geometry_parser+ - an object with a method named +from_file+ that takes an image file and produces its geometry and a +transformation_to+. Defaults to Paperclip::Geometry
+string_geometry_parser+ - an object with a method named +parse+ that takes a string and produces an object with +width+, +height+, and +to_s+ accessors. Defaults to Paperclip::Geometry
+source_file_options+ - flags passed to the +convert+ command that influence how the source file is read
+convert_options+ - flags passed to the +convert+ command that influence how the image is processed
+whiny+ - whether to raise an error when processing fails. Defaults to true
+format+ - the desired filename extension
+animated+ - whether to merge all the layers in the image. Defaults to true
+frame_index+ - the frame index of the source file to render as the thumbnail
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/paperclip/thumbnail.rb', line 30 def initialize(file, = {}, = nil) super geometry = [:geometry].to_s @crop = geometry[-1,1] == '#' @target_geometry = .fetch(:string_geometry_parser, Geometry).parse(geometry) @current_geometry = .fetch(:file_geometry_parser, Geometry).from_file(@file) @source_file_options = [:source_file_options] @convert_options = [:convert_options] @whiny = .fetch(:whiny, true) @format = [:format] @animated = .fetch(:animated, true) @auto_orient = .fetch(:auto_orient, true) if @auto_orient && @current_geometry.respond_to?(:auto_orient) @current_geometry.auto_orient end @source_file_options = @source_file_options.split(/\s+/) if @source_file_options.respond_to?(:split) @convert_options = @convert_options.split(/\s+/) if @convert_options.respond_to?(:split) @current_format = File.extname(@file.path) @basename = File.basename(@file.path, @current_format) @frame_index = multi_frame_format? ? .fetch(:frame_index, 0) : 0 end |
Instance Attribute Details
#animated ⇒ Object
Returns the value of attribute animated.
5 6 7 |
# File 'lib/paperclip/thumbnail.rb', line 5 def animated @animated end |
#auto_orient ⇒ Object
Returns the value of attribute auto_orient.
5 6 7 |
# File 'lib/paperclip/thumbnail.rb', line 5 def auto_orient @auto_orient end |
#convert_options ⇒ Object
Returns the value of attribute convert_options.
5 6 7 |
# File 'lib/paperclip/thumbnail.rb', line 5 def @convert_options end |
#current_geometry ⇒ Object
Returns the value of attribute current_geometry.
5 6 7 |
# File 'lib/paperclip/thumbnail.rb', line 5 def current_geometry @current_geometry end |
#format ⇒ Object
Returns the value of attribute format.
5 6 7 |
# File 'lib/paperclip/thumbnail.rb', line 5 def format @format end |
#frame_index ⇒ Object
Returns the value of attribute frame_index.
5 6 7 |
# File 'lib/paperclip/thumbnail.rb', line 5 def frame_index @frame_index end |
#source_file_options ⇒ Object
Returns the value of attribute source_file_options.
5 6 7 |
# File 'lib/paperclip/thumbnail.rb', line 5 def @source_file_options end |
#target_geometry ⇒ Object
Returns the value of attribute target_geometry.
5 6 7 |
# File 'lib/paperclip/thumbnail.rb', line 5 def target_geometry @target_geometry end |
#whiny ⇒ Object
Returns the value of attribute whiny.
5 6 7 |
# File 'lib/paperclip/thumbnail.rb', line 5 def whiny @whiny end |
Instance Method Details
#convert_options? ⇒ Boolean
Returns true if the image is meant to make use of additional convert options.
60 61 62 |
# File 'lib/paperclip/thumbnail.rb', line 60 def !@convert_options.nil? && !@convert_options.empty? end |
#crop? ⇒ Boolean
Returns true if the target_geometry
is meant to crop.
55 56 57 |
# File 'lib/paperclip/thumbnail.rb', line 55 def crop? @crop end |
#make ⇒ Object
Performs the conversion of the file
into a thumbnail. Returns the Tempfile that contains the new image.
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/paperclip/thumbnail.rb', line 66 def make src = @file filename = [@basename, @format ? ".#{@format}" : ""].join dst = TempfileFactory.new.generate(filename) begin parameters = [] parameters << parameters << ":source" parameters << transformation_command parameters << parameters << ":dest" parameters = parameters.flatten.compact.join(" ").strip.squeeze(" ") frame = animated? ? "" : "[#{@frame_index}]" convert( parameters, source: "#{File.(src.path)}#{frame}", dest: File.(dst.path), ) rescue Terrapin::ExitStatusError => e if @whiny = "There was an error processing the thumbnail for #{@basename}:\n" + e. raise Paperclip::Error, end rescue Terrapin::CommandNotFoundError => e raise Paperclip::Errors::CommandNotFoundError.new("Could not run the `convert` command. Please install ImageMagick.") end dst end |
#transformation_command ⇒ Object
Returns the command ImageMagick’s convert
needs to transform the image into the thumbnail.
101 102 103 104 105 106 107 108 109 110 |
# File 'lib/paperclip/thumbnail.rb', line 101 def transformation_command scale, crop = @current_geometry.transformation_to(@target_geometry, crop?) trans = [] trans << "-coalesce" if animated? trans << "-auto-orient" if auto_orient trans << "-resize" << %["#{scale}"] unless scale.nil? || scale.empty? trans << "-crop" << %["#{crop}"] << "+repage" if crop trans << '-layers "optimize"' if animated? trans end |