Class: MiniMagick::Image
- Inherits:
-
Object
- Object
- MiniMagick::Image
- Defined in:
- lib/mini_magick.rb
Instance Attribute Summary collapse
-
#output ⇒ Object
readonly
Returns the value of attribute output.
-
#path ⇒ Object
readonly
Returns the value of attribute path.
-
#tempfile ⇒ Object
readonly
Returns the value of attribute tempfile.
Class Method Summary collapse
- .from_blob(blob, extension = nil) ⇒ Object
-
.open(image_path) ⇒ Object
(also: from_file)
Use this if you don’t want to overwrite the image file.
Instance Method Summary collapse
-
#[](value) ⇒ Object
For reference see www.imagemagick.org/script/command-line-options.php#format.
-
#combine_options(&block) ⇒ Object
You can use multiple commands together using this method.
-
#crop_resized(width, height, gravity = "Center") ⇒ Object
Scale an image down and crop away any extra to achieve a certain size.
-
#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).
-
#format_option(format) ⇒ Object
Outputs a carriage-return delimited format string for Unix and Windows.
-
#initialize(input_path, tempfile = nil) ⇒ Image
constructor
Instance Methods —————-.
-
#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).
- #run_command(command, *args) ⇒ Object
-
#to_blob ⇒ Object
Give you raw data back.
-
#windows? ⇒ Boolean
Check to see if we are running on win32 – we need to escape things differently.
-
#write(output_path) ⇒ Object
Writes the temporary image that we are using for processing to the output path.
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
#output ⇒ Object (readonly)
Returns the value of attribute output.
15 16 17 |
# File 'lib/mini_magick.rb', line 15 def output @output end |
#path ⇒ Object (readonly)
Returns the value of attribute path.
13 14 15 |
# File 'lib/mini_magick.rb', line 13 def path @path end |
#tempfile ⇒ Object (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
For reference see www.imagemagick.org/script/command-line-options.php#format
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 (&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]) 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_blob ⇒ Object
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
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 |