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




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

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)



91
92
93
94
95
# File 'lib/mini_magick.rb', line 91

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

.from_file(image_path) ⇒ Object

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 from_file(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



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/mini_magick.rb', line 51

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 "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



98
99
100
101
102
# File 'lib/mini_magick.rb', line 98

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

#format(format) ⇒ Object

This is a ‘special’ command because it needs to change @path to reflect the new extension



71
72
73
74
75
76
# File 'lib/mini_magick.rb', line 71

def format(format)
  run_command("mogrify", "-format", format, @path)
  @path = @path.sub(/(\.\w+)?$/, ".#{format}")
  
  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



110
111
112
# File 'lib/mini_magick.rb', line 110

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

#run_command(command, *args) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/mini_magick.rb', line 114

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



85
86
87
# File 'lib/mini_magick.rb', line 85

def to_blob
  File.read @path
end

#windows?Boolean

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

Returns:

  • (Boolean)


105
106
107
# File 'lib/mini_magick.rb', line 105

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



79
80
81
82
# File 'lib/mini_magick.rb', line 79

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