Class: MiniMagick::Image

Inherits:
Object
  • Object
show all
Defined in:
lib/mini_magick.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(input_path, tempfile = nil) ⇒ Image

Instance Methods




43
44
45
46
47
48
49
# File 'lib/mini_magick.rb', line 43

def initialize(input_path, tempfile=nil)
  @path = input_path
  @tempfile = tempfile # ensures that the tempfile will stick around until this image is garbage collected.

  # Ensure that the file is an image
  run_command("identify", @path)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(symbol, *args) ⇒ Object

If an unknown method is called then it is sent through the morgrify program Look here to find all the commands (www.imagemagick.org/script/mogrify.php)



135
136
137
138
139
# File 'lib/mini_magick.rb', line 135

def method_missing(symbol, *args)
  args.push(@path) # push the path onto the end
  run_command("mogrify", "-#{symbol}", *args)
  self
end

Instance Attribute Details

#outputObject (readonly)

Returns the value of attribute output.



15
16
17
# File 'lib/mini_magick.rb', line 15

def output
  @output
end

#pathObject (readonly)

Returns the value of attribute path.



13
14
15
# File 'lib/mini_magick.rb', line 13

def path
  @path
end

#tempfileObject (readonly)

Returns the value of attribute tempfile.



14
15
16
# File 'lib/mini_magick.rb', line 14

def tempfile
  @tempfile
end

Class Method Details

.from_blob(blob, extension = nil) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/mini_magick.rb', line 20

def from_blob(blob, extension=nil)
  begin
    tempfile = ImageTempFile.new("minimagick#{extension}")
    tempfile.binmode
    tempfile.write(blob)
  ensure
    tempfile.close
  end
  
  return self.new(tempfile.path, tempfile)
end

.open(image_path) ⇒ Object Also known as: from_file

Use this if you don’t want to overwrite the image file



33
34
35
36
37
# File 'lib/mini_magick.rb', line 33

def open(image_path)
  File.open(image_path, "rb") do |f|
    self.from_blob(f.read, File.extname(image_path))
  end
end

Instance Method Details

#[](value) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/mini_magick.rb', line 52

def [](value)
  # Why do I go to the trouble of putting in newlines? Because otherwise animated gifs screw everything up
  case value.to_s
  when "format"
    run_command("identify", "-format", format_option("%m"), @path).split("\n")[0]
  when "height"
    run_command("identify", "-format", format_option("%h"), @path).split("\n")[0].to_i
  when "width"
    run_command("identify", "-format", format_option("%w"), @path).split("\n")[0].to_i
  when "dimensions"
    dimensions = run_command("identify", "-format", format_option("%w %h"), @path).split("\n")[0].split(" ")
    { :width => dimensions[0].to_i, :height => dimensions[1].to_i }
  when "size"
    File.size(@path) # Do this because calling identify -format "%b" on an animated gif fails!
  when "original_at"
    # Get the EXIF original capture as a Time object
    Time.local(*self["EXIF:DateTimeOriginal"].split(/:|\s+/)) rescue nil
  when /^EXIF\:/i
    run_command('identify', '-format', "\"%[#{value}]\"", @path).chop
  else
    run_command('identify', '-format', "\"#{value}\"", @path).split("\n")[0]
  end
end

#combine_options(&block) ⇒ Object

You can use multiple commands together using this method



142
143
144
145
146
# File 'lib/mini_magick.rb', line 142

def combine_options(&block)
  c = CommandBuilder.new
  block.call c
  run_command("convert", *c.args << @path << @path)
end

#crop_resized(width, height, gravity = "Center") ⇒ Object

Scale an image down and crop away any extra to achieve a certain size. This is handy for creating thumbnails of the same dimensions without changing the aspect ratio.



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/mini_magick.rb', line 92

def crop_resized(width, height, gravity = "Center")
  width = width.to_i
  height = height.to_i

  # Grab the width and height of the current image in one go.
  dimensions = self[:dimensions]

  # Only do anything if needs be. Who knows, maybe it's already the exact
  # dimensions we're looking for.
  if(width != dimensions[:width] && height != dimensions[:height])
    combine_options do |c|
      # Scale the image down to the widest dimension.
      if(width != dimensions[:width] || height != dimensions[:height])
        scale = [width / dimensions[:width].to_f, height / dimensions[:height].to_f].max * 100
        c.resize("#{scale}%")
      end

      # Align how things will be cropped.
      c.gravity(gravity)

      # Crop the image to size.
      c.crop("#{width}x#{height}+0+0")
    end
  end
end

#format(format, page = 0) ⇒ Object

This is a ‘special’ command because it needs to change @path to reflect the new extension Formatting an animation into a non-animated type will result in ImageMagick creating multiple pages (starting with 0). You can choose which page you want to manipulate. We default to the first page.



80
81
82
83
84
85
86
87
# File 'lib/mini_magick.rb', line 80

def format(format, page=0)
  run_command("mogrify", "-format", format, @path)

  @path.sub!(/(\.\w+)?$/, ".#{format}")
  @path.sub!(".#{format}", "-#{page}.#{format}") unless File.exists?(@path)

  raise "Unable to format to #{format}" unless File.exists?(@path)
end

#format_option(format) ⇒ Object

Outputs a carriage-return delimited format string for Unix and Windows



154
155
156
# File 'lib/mini_magick.rb', line 154

def format_option(format)
  windows? ? "#{format}\\n" : "#{format}\\\\n"
end

#run_command(command, *args) ⇒ Object



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/mini_magick.rb', line 158

def run_command(command, *args)
  args.collect! do |arg|
    arg = arg.to_s
    arg = %|"#{arg}"| unless arg[0] == ?- # values quoted because they can contain characters like '>', but don't quote switches          
    arg
  end

  @output = `#{command} #{args.join(' ')}`

  if $? != 0
    raise MiniMagickError, "ImageMagick command (#{command} #{args.join(' ')}) failed: Error Given #{$?}"
  else
    @output
  end
end

#to_blobObject

Give you raw data back



125
126
127
128
129
130
131
# File 'lib/mini_magick.rb', line 125

def to_blob
  f = File.new @path
  f.binmode
  f.read
ensure
  f.close
end

#windows?Boolean

Check to see if we are running on win32 – we need to escape things differently

Returns:

  • (Boolean)


149
150
151
# File 'lib/mini_magick.rb', line 149

def windows?
  !(RUBY_PLATFORM =~ /win32/).nil?
end

#write(output_path) ⇒ Object

Writes the temporary image that we are using for processing to the output path



119
120
121
122
# File 'lib/mini_magick.rb', line 119

def write(output_path)
  FileUtils.copy_file @path, output_path
  run_command "identify", output_path # Verify that we have a good image
end