Class: Paperclip::OffsetThumbnail

Inherits:
Processor
  • Object
show all
Defined in:
lib/paperclip_processors/offset_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)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(file, options = {}, attachment = nil) ⇒ OffsetThumbnail

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


27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/paperclip_processors/offset_thumbnail.rb', line 27

def initialize(file, options = {}, attachment = nil)
  super

  geometry             = options[:geometry] # this is not an option
  @file                = file
  @crop                = geometry[-1,1] == '#'
  @target_geometry     = (options[:string_geometry_parser] || Geometry).parse(geometry)
  @current_geometry    = (options[:file_geometry_parser] || Geometry).from_file(@file)
  @whiny               = options[:whiny].nil? ? true : options[:whiny]
  @format              = options[:format]
  @animated            = options[:animated].nil? ? true : options[:animated]
  @scale               = options[:scale]
  @crop_and_offset     = options[:crop_and_offset]
  @current_format      = File.extname(@file.path)
  @basename            = File.basename(@file.path, @current_format)
end

Instance Attribute Details

#animatedObject

Returns the value of attribute animated.



5
6
7
# File 'lib/paperclip_processors/offset_thumbnail.rb', line 5

def animated
  @animated
end

#crop_and_offsetObject

Returns the value of attribute crop_and_offset.



5
6
7
# File 'lib/paperclip_processors/offset_thumbnail.rb', line 5

def crop_and_offset
  @crop_and_offset
end

#current_geometryObject

Returns the value of attribute current_geometry.



5
6
7
# File 'lib/paperclip_processors/offset_thumbnail.rb', line 5

def current_geometry
  @current_geometry
end

#formatObject

Returns the value of attribute format.



5
6
7
# File 'lib/paperclip_processors/offset_thumbnail.rb', line 5

def format
  @format
end

#scaleObject

Returns the value of attribute scale.



5
6
7
# File 'lib/paperclip_processors/offset_thumbnail.rb', line 5

def scale
  @scale
end

#target_geometryObject

Returns the value of attribute target_geometry.



5
6
7
# File 'lib/paperclip_processors/offset_thumbnail.rb', line 5

def target_geometry
  @target_geometry
end

#whinyObject

Returns the value of attribute whiny.



5
6
7
# File 'lib/paperclip_processors/offset_thumbnail.rb', line 5

def whiny
  @whiny
end

Instance Method Details

#makeObject

Performs the conversion of the file into a thumbnail. Returns the Tempfile that contains the new image.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/paperclip_processors/offset_thumbnail.rb', line 46

def make
  src = @file
  dst = Tempfile.new([@basename, @format ? ".#{@format}" : ''])
  dst.binmode

  begin
    parameters = []
    parameters << ":source"
    parameters << transformation_command
    parameters << ":dest"

    parameters = parameters.flatten.compact.join(" ").strip.squeeze(" ")

    success = Paperclip.run("convert", parameters, :source => "#{File.expand_path(src.path)}#{'[0]' unless animated?}", :dest => File.expand_path(dst.path))
  rescue Cocaine::ExitStatusError => e
    raise Paperclip::Error, "There was an error processing the thumbnail for #{@basename}: #{e}" if @whiny
  rescue Cocaine::CommandNotFoundError => e
    raise Paperclip::CommandNotFoundError.new("Could not run the `convert` command. Please install ImageMagick.")
  end

  dst
end

#transformation_commandObject

Returns the arguments to ImageMagick’s convert that will transform the image into the thumbnail.



70
71
72
73
74
75
76
# File 'lib/paperclip_processors/offset_thumbnail.rb', line 70

def transformation_command
  trans = []
  trans << "-coalesce" if animated?
  trans << "-resize" << %["#{scale}"] unless scale.nil? || scale.empty?
  trans << "-crop" << %["#{crop_and_offset}"] << "+repage"
  trans
end