mini_magick 3.8.0 → 3.8.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of mini_magick might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/mini_magick.rb +12 -26
- data/lib/mini_magick/command_builder.rb +6 -22
- data/lib/mini_magick/image.rb +121 -102
- data/lib/mini_magick/utilities.rb +26 -0
- data/lib/mini_magick/version.rb +15 -1
- data/spec/files/actually_a_gif.jpg +0 -0
- data/spec/files/animation.gif +0 -0
- data/spec/files/composited.jpg +0 -0
- data/spec/files/erroneous.jpg +0 -0
- data/spec/files/layers.psd +0 -0
- data/spec/files/leaves (spaced).tiff +0 -0
- data/spec/files/not_an_image.php +1 -0
- data/spec/files/png.png +0 -0
- data/spec/files/simple-minus.gif +0 -0
- data/spec/files/simple.gif +0 -0
- data/spec/files/trogdor.jpg +0 -0
- data/spec/files/trogdor_capitalized.JPG +0 -0
- data/spec/lib/mini_magick/command_builder_spec.rb +153 -0
- data/spec/lib/mini_magick/image_spec.rb +499 -0
- data/spec/lib/mini_magick_spec.rb +63 -0
- data/spec/spec_helper.rb +29 -0
- metadata +40 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f4ae6b4f7d224af6275ad37b108c978f3fd8817
|
4
|
+
data.tar.gz: 69d6e3f3b1289af2dd54a0309166e71fce1e2f45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 248c08f2af654156c2a422bb3bb3e48a9b97087bab6dacace044bbc2175465c9a2e5de09eac05cb4110cc4efcc8a47f25424f03f6effa6df2cbb2fda85524557
|
7
|
+
data.tar.gz: 3c000c0861b8e66312d875b8858cdc3fe0b32c842332b70c979675acbf9b4fc62fcb4732c5c49db96240e0bf400974a90ee01e90a34b1c3d817eaf60444030fb
|
data/lib/mini_magick.rb
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
require 'tempfile'
|
2
|
-
require 'subexec'
|
3
|
-
require 'stringio'
|
4
|
-
require 'pathname'
|
5
|
-
require 'shellwords'
|
6
1
|
require 'mini_magick/command_builder'
|
7
2
|
require 'mini_magick/errors'
|
8
3
|
require 'mini_magick/image'
|
@@ -16,23 +11,20 @@ module MiniMagick
|
|
16
11
|
attr_accessor :processor
|
17
12
|
attr_accessor :processor_path
|
18
13
|
attr_accessor :timeout
|
14
|
+
attr_accessor :debug
|
19
15
|
attr_accessor :validate_on_create
|
20
16
|
attr_accessor :validate_on_write
|
21
17
|
|
22
18
|
##
|
23
|
-
# Tries to detect the current processor based if any of the processors
|
24
|
-
# Mogrify have precedence over gm by default.
|
19
|
+
# Tries to detect the current processor based if any of the processors
|
20
|
+
# exist. Mogrify have precedence over gm by default.
|
25
21
|
#
|
26
22
|
# === Returns
|
27
|
-
# * [
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
:gm
|
33
|
-
else
|
34
|
-
nil
|
35
|
-
end
|
23
|
+
# * [Symbol] The detected procesor
|
24
|
+
def processor
|
25
|
+
@processor ||= [:mogrify, :gm].detect do |processor|
|
26
|
+
MiniMagick::Utilities.which(processor.to_s)
|
27
|
+
end
|
36
28
|
end
|
37
29
|
|
38
30
|
##
|
@@ -63,27 +55,21 @@ module MiniMagick
|
|
63
55
|
end
|
64
56
|
|
65
57
|
##
|
66
|
-
#
|
58
|
+
# Checks whether the current processory is mogrify.
|
67
59
|
#
|
68
60
|
# === Returns
|
69
61
|
# * [Boolean]
|
70
62
|
def mogrify?
|
71
|
-
|
72
|
-
|
73
|
-
return processor.to_s.downcase.to_sym == :mogrify unless processor.nil?
|
74
|
-
false
|
63
|
+
processor && processor.to_sym == :mogrify
|
75
64
|
end
|
76
65
|
|
77
66
|
##
|
78
|
-
#
|
67
|
+
# Checks whether the current processor is graphicsmagick.
|
79
68
|
#
|
80
69
|
# === Returns
|
81
70
|
# * [Boolean]
|
82
71
|
def gm?
|
83
|
-
|
84
|
-
|
85
|
-
return processor.to_s.downcase.to_sym == :gm unless processor.nil?
|
86
|
-
false
|
72
|
+
processor && processor.to_sym == :gm
|
87
73
|
end
|
88
74
|
end
|
89
75
|
end
|
@@ -13,16 +13,12 @@ module MiniMagick
|
|
13
13
|
com = "#{@tool} #{args.join(' ')}".strip
|
14
14
|
com = "#{MiniMagick.processor} #{com}" unless MiniMagick.mogrify?
|
15
15
|
|
16
|
-
com = File.join MiniMagick.processor_path, com
|
16
|
+
com = File.join MiniMagick.processor_path, com if MiniMagick.processor_path
|
17
17
|
com.strip
|
18
18
|
end
|
19
19
|
|
20
20
|
def args
|
21
|
-
|
22
|
-
@args.map(&:shellescape)
|
23
|
-
else
|
24
|
-
@args.map { |arg| Utilities.windows_escape(arg) }
|
25
|
-
end
|
21
|
+
@args.map { |arg| Utilities.escape(arg) }
|
26
22
|
end
|
27
23
|
|
28
24
|
# Add each mogrify command in both underscore and dash format
|
@@ -75,30 +71,18 @@ module MiniMagick
|
|
75
71
|
end
|
76
72
|
|
77
73
|
def +(*options)
|
78
|
-
push(@args.pop.gsub(
|
79
|
-
|
80
|
-
options.each do |o|
|
81
|
-
push o
|
82
|
-
end
|
83
|
-
end
|
74
|
+
push(@args.pop.gsub(/\A-/, '+'))
|
75
|
+
options.to_a.each { |option| push(option) }
|
84
76
|
end
|
85
77
|
|
86
78
|
def add_command(command, *options)
|
87
79
|
push "-#{command}"
|
88
|
-
|
89
|
-
options.each do |o|
|
90
|
-
push o
|
91
|
-
end
|
92
|
-
end
|
80
|
+
options.to_a.each { |option| push(option) }
|
93
81
|
end
|
94
82
|
|
95
83
|
def add_creation_operator(command, *options)
|
96
84
|
creation_command = command
|
97
|
-
|
98
|
-
options.each do |option|
|
99
|
-
creation_command << ":#{option}"
|
100
|
-
end
|
101
|
-
end
|
85
|
+
options.to_a.each { |option| creation_command << ":#{option}" }
|
102
86
|
push creation_command
|
103
87
|
end
|
104
88
|
|
data/lib/mini_magick/image.rb
CHANGED
@@ -1,35 +1,37 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'subexec'
|
3
|
+
require 'stringio'
|
4
|
+
require 'pathname'
|
5
|
+
|
1
6
|
module MiniMagick
|
2
7
|
class Image
|
3
8
|
# @return [String] The location of the current working file
|
4
9
|
attr_writer :path
|
5
10
|
|
6
|
-
def path_for_windows_quote_space(path)
|
7
|
-
path = Pathname.new(@path).to_s
|
8
|
-
# For Windows, if a path contains space char, you need to quote it, otherwise you SHOULD NOT quote it.
|
9
|
-
# If you quote a path that does not contains space, it will not work.
|
10
|
-
@path.include?(' ') ? path.inspect : path
|
11
|
-
end
|
12
|
-
|
13
11
|
def path
|
14
12
|
run_queue if @command_queued
|
15
|
-
MiniMagick::Utilities.
|
13
|
+
MiniMagick::Utilities.path(@path)
|
16
14
|
end
|
17
15
|
|
18
16
|
# Class Methods
|
19
17
|
# -------------
|
20
18
|
class << self
|
21
|
-
# This is the primary loading method used by all of the other class
|
19
|
+
# This is the primary loading method used by all of the other class
|
20
|
+
# methods.
|
22
21
|
#
|
23
|
-
# Use this to pass in a stream object. Must respond to Object#read(size)
|
22
|
+
# Use this to pass in a stream object. Must respond to Object#read(size)
|
23
|
+
# or be a binary string object (BLOBBBB)
|
24
24
|
#
|
25
|
-
# As a change from the old API, please try and use IOStream objects.
|
26
|
-
#
|
25
|
+
# As a change from the old API, please try and use IOStream objects. They
|
26
|
+
# are much, much better and more efficient!
|
27
27
|
#
|
28
|
-
# Probably easier to use the #open method if you want to open a file or a
|
28
|
+
# Probably easier to use the #open method if you want to open a file or a
|
29
|
+
# URL.
|
29
30
|
#
|
30
|
-
# @param stream [IOStream, String] Some kind of stream object that needs
|
31
|
-
#
|
32
|
-
#
|
31
|
+
# @param stream [IOStream, String] Some kind of stream object that needs
|
32
|
+
# to be read or is a binary String blob!
|
33
|
+
# @param ext [String] A manual extension to use for reading the file. Not
|
34
|
+
# required, but if you are having issues, give this a try.
|
33
35
|
# @return [Image]
|
34
36
|
def read(stream, ext = nil)
|
35
37
|
if stream.is_a?(String)
|
@@ -57,31 +59,32 @@ module MiniMagick
|
|
57
59
|
create(ext) { |f| f.write(blob) }
|
58
60
|
end
|
59
61
|
|
60
|
-
# Creates an image object from a binary string blob which contains raw
|
61
|
-
#
|
62
|
-
# === Returns
|
62
|
+
# Creates an image object from a binary string blob which contains raw
|
63
|
+
# pixel data (i.e. no header data).
|
63
64
|
#
|
64
|
-
#
|
65
|
-
#
|
66
|
-
#
|
67
|
-
#
|
68
|
-
#
|
69
|
-
#
|
70
|
-
#
|
71
|
-
#
|
72
|
-
# * [map] <tt>String</tt> -- A code for the mapping of the pixel data. Example: 'gray' or 'rgb'.
|
73
|
-
# * [format] <tt>String</tt> -- The file extension of the image format to be used when creating the image object.
|
65
|
+
# @param blob [String] Binary string blob containing raw pixel data.
|
66
|
+
# @param columns [Integer] Number of columns.
|
67
|
+
# @param rows [Integer] Number of rows.
|
68
|
+
# @param depth [Integer] Bit depth of the encoded pixel data.
|
69
|
+
# @param map [String] A code for the mapping of the pixel data. Example:
|
70
|
+
# 'gray' or 'rgb'.
|
71
|
+
# @param format [String] The file extension of the image format to be
|
72
|
+
# used when creating the image object.
|
74
73
|
# Defaults to 'png'.
|
74
|
+
# @return [Image] The loaded image.
|
75
75
|
#
|
76
76
|
def import_pixels(blob, columns, rows, depth, map, format = 'png')
|
77
77
|
# Create an image object with the raw pixel data string:
|
78
78
|
image = create('.dat', false) { |f| f.write(blob) }
|
79
|
-
# Use ImageMagick to convert the raw data file to an image file of the
|
79
|
+
# Use ImageMagick to convert the raw data file to an image file of the
|
80
|
+
# desired format:
|
80
81
|
converted_image_path = image.path[0..-4] + format
|
81
82
|
arguments = ['-size', "#{columns}x#{rows}", '-depth', "#{depth}", "#{map}:#{image.path}", "#{converted_image_path}"]
|
82
|
-
|
83
|
+
# Example: convert -size 256x256 -depth 16 gray:blob.dat blob.png
|
84
|
+
cmd = CommandBuilder.new('convert', *arguments)
|
83
85
|
image.run(cmd)
|
84
|
-
# Update the image instance with the path of the properly formatted
|
86
|
+
# Update the image instance with the path of the properly formatted
|
87
|
+
# image, and return:
|
85
88
|
image.path = converted_image_path
|
86
89
|
image
|
87
90
|
end
|
@@ -90,15 +93,18 @@ module MiniMagick
|
|
90
93
|
#
|
91
94
|
# Use this if you don't want to overwrite the image file.
|
92
95
|
#
|
93
|
-
# Extension is either guessed from the path or you can specify it as a
|
96
|
+
# Extension is either guessed from the path or you can specify it as a
|
97
|
+
# second parameter.
|
94
98
|
#
|
95
|
-
# If you pass in what looks like a URL, we require 'open-uri' before
|
99
|
+
# If you pass in what looks like a URL, we require 'open-uri' before
|
100
|
+
# opening it.
|
96
101
|
#
|
97
|
-
# @param file_or_url [String] Either a local file path or a URL that
|
102
|
+
# @param file_or_url [String] Either a local file path or a URL that
|
103
|
+
# open-uri can read
|
98
104
|
# @param ext [String] Specify the extension you want to read it as
|
99
105
|
# @return [Image] The loaded image
|
100
106
|
def open(file_or_url, ext = nil)
|
101
|
-
file_or_url = file_or_url.to_s # Force
|
107
|
+
file_or_url = file_or_url.to_s # Force String... Hell or high water
|
102
108
|
if file_or_url.include?('://')
|
103
109
|
require 'open-uri'
|
104
110
|
ext ||= File.extname(URI.parse(file_or_url).path)
|
@@ -119,43 +125,47 @@ module MiniMagick
|
|
119
125
|
open(file, ext)
|
120
126
|
end
|
121
127
|
|
122
|
-
# Used to create a new Image object data-copy. Not used to "paint" or
|
128
|
+
# Used to create a new Image object data-copy. Not used to "paint" or
|
129
|
+
# that kind of thing.
|
123
130
|
#
|
124
|
-
# Takes an extension in a block and can be used to build a new Image
|
125
|
-
# by both #open and #read to create a new object! Ensures we
|
131
|
+
# Takes an extension in a block and can be used to build a new Image
|
132
|
+
# object. Used by both #open and #read to create a new object! Ensures we
|
133
|
+
# have a good tempfile!
|
126
134
|
#
|
127
135
|
# @param ext [String] Specify the extension you want to read it as
|
128
|
-
# @param validate [Boolean] If false, skips validation of the created
|
129
|
-
#
|
136
|
+
# @param validate [Boolean] If false, skips validation of the created
|
137
|
+
# image. Defaults to true.
|
138
|
+
# @yield [IOStream] You can #write bits to this object to create the new
|
139
|
+
# Image
|
130
140
|
# @return [Image] The created image
|
131
141
|
def create(ext = nil, validate = MiniMagick.validate_on_create, &block)
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
tempfile.close if tempfile
|
144
|
-
end
|
142
|
+
tempfile = Tempfile.new(['mini_magick', ext.to_s.downcase])
|
143
|
+
tempfile.binmode
|
144
|
+
block.call(tempfile)
|
145
|
+
tempfile.close
|
146
|
+
|
147
|
+
image = new(tempfile.path, tempfile)
|
148
|
+
|
149
|
+
fail MiniMagick::Invalid if validate && !image.valid?
|
150
|
+
return image
|
151
|
+
ensure
|
152
|
+
tempfile.close if tempfile
|
145
153
|
end
|
146
154
|
end
|
147
155
|
|
148
156
|
# Create a new MiniMagick::Image object
|
149
157
|
#
|
150
|
-
# _DANGER_: The file location passed in here is the *working copy*. That
|
151
|
-
# you can either copy it yourself or use the
|
152
|
-
#
|
158
|
+
# _DANGER_: The file location passed in here is the *working copy*. That
|
159
|
+
# is, it gets *modified*. you can either copy it yourself or use the
|
160
|
+
# MiniMagick::Image.open(path) method which creates a temporary file for
|
161
|
+
# you and protects your original!
|
153
162
|
#
|
154
163
|
# @param input_path [String] The location of an image file
|
155
|
-
# @todo Allow this to accept a block that can pass off to
|
164
|
+
# @todo Allow this to accept a block that can pass off to
|
165
|
+
# Image#combine_options
|
156
166
|
def initialize(input_path, tempfile = nil)
|
157
167
|
@path = input_path
|
158
|
-
@tempfile = tempfile
|
168
|
+
@tempfile = tempfile
|
159
169
|
@info = {}
|
160
170
|
reset_queue
|
161
171
|
end
|
@@ -168,16 +178,16 @@ module MiniMagick
|
|
168
178
|
|
169
179
|
def run_queue
|
170
180
|
return nil unless @command_queued
|
171
|
-
@queue <<
|
181
|
+
@queue << MiniMagick::Utilities.path(@path)
|
172
182
|
run(@queue)
|
173
183
|
reset_queue
|
174
184
|
end
|
175
185
|
|
176
186
|
# Checks to make sure that MiniMagick can read the file and understand it.
|
177
187
|
#
|
178
|
-
# This uses the 'identify' command line utility to check the file. If you
|
179
|
-
# issues with this, then please work directly with the
|
180
|
-
# can figure out what the issue is.
|
188
|
+
# This uses the 'identify' command line utility to check the file. If you
|
189
|
+
# are having issues with this, then please work directly with the
|
190
|
+
# 'identify' command and see if you can figure out what the issue is.
|
181
191
|
#
|
182
192
|
# @return [Boolean]
|
183
193
|
def valid?
|
@@ -192,8 +202,10 @@ module MiniMagick
|
|
192
202
|
|
193
203
|
@info[key]
|
194
204
|
end
|
195
|
-
|
196
|
-
#
|
205
|
+
|
206
|
+
# A rather low-level way to interact with the "identify" command. No nice
|
207
|
+
# API here, just the crazy stuff you find in ImageMagick. See the examples
|
208
|
+
# listed!
|
197
209
|
#
|
198
210
|
# @example
|
199
211
|
# image["format"] #=> "TIFF"
|
@@ -206,13 +218,15 @@ module MiniMagick
|
|
206
218
|
# image["EXIF:ExifVersion"] #=> "0220" (Can read anything from Exif)
|
207
219
|
#
|
208
220
|
# @param format [String] A format for the "identify" command
|
209
|
-
# @see
|
210
|
-
# @return [String, Numeric, Array, Time, Object] Depends on the method
|
221
|
+
# @see http://www.imagemagick.org/script/command-line-options.php#format
|
222
|
+
# @return [String, Numeric, Array, Time, Object] Depends on the method
|
223
|
+
# called! Defaults to String for unknown commands
|
211
224
|
def [](value)
|
212
225
|
retrieved = info(value)
|
213
226
|
return retrieved unless retrieved.nil?
|
214
227
|
|
215
|
-
# Why do I go to the trouble of putting in newlines? Because otherwise
|
228
|
+
# Why do I go to the trouble of putting in newlines? Because otherwise
|
229
|
+
# animated gifs screw everything up
|
216
230
|
retrieved = case value.to_s
|
217
231
|
when 'colorspace'
|
218
232
|
run_command('identify', '-format', '%r\n', path).split("\n")[0].strip
|
@@ -226,7 +240,7 @@ module MiniMagick
|
|
226
240
|
@info[:width] = width_height[0]
|
227
241
|
@info[:height] = width_height[1]
|
228
242
|
@info[:dimensions] = width_height
|
229
|
-
|
243
|
+
@info[value.to_sym]
|
230
244
|
when 'size'
|
231
245
|
File.size(path) # Do this because calling identify -format "%b" on an animated gif fails!
|
232
246
|
when 'original_at'
|
@@ -247,33 +261,38 @@ module MiniMagick
|
|
247
261
|
@info[value]
|
248
262
|
end
|
249
263
|
|
250
|
-
# Sends raw commands to imagemagick's `mogrify` command. The image path is
|
264
|
+
# Sends raw commands to imagemagick's `mogrify` command. The image path is
|
265
|
+
# automatically appended to the command.
|
251
266
|
#
|
252
|
-
# Remember, we are always acting on this instance of the Image when messing
|
267
|
+
# Remember, we are always acting on this instance of the Image when messing
|
268
|
+
# with this.
|
253
269
|
#
|
254
|
-
# @return [String] Whatever the result from the command line is. May not be
|
270
|
+
# @return [String] Whatever the result from the command line is. May not be
|
271
|
+
# terribly useful.
|
255
272
|
def <<(*args)
|
256
273
|
run_command('mogrify', *args << path)
|
257
274
|
end
|
258
275
|
|
259
|
-
# This is used to change the format of the image. That is, from "tiff to
|
260
|
-
# Once you run it, the instance is pointing to
|
276
|
+
# This is used to change the format of the image. That is, from "tiff to
|
277
|
+
# jpg" or something like that. Once you run it, the instance is pointing to
|
278
|
+
# a new file with a new extension!
|
261
279
|
#
|
262
|
-
# *DANGER*: This renames the file that the instance is pointing to. So, if
|
263
|
-
# file with Image.new(file_path)... Then that file
|
264
|
-
#
|
280
|
+
# *DANGER*: This renames the file that the instance is pointing to. So, if
|
281
|
+
# you manually opened the file with Image.new(file_path)... Then that file
|
282
|
+
# is DELETED! If you used Image.open(file) then you are OK. The original
|
283
|
+
# file will still be there. But, any changes to it might not be...
|
265
284
|
#
|
266
|
-
# Formatting an animation into a non-animated type will result in
|
267
|
-
# pages (starting with 0). You can choose
|
268
|
-
# first page.
|
285
|
+
# Formatting an animation into a non-animated type will result in
|
286
|
+
# ImageMagick creating multiple pages (starting with 0). You can choose
|
287
|
+
# which page you want to manipulate. We default to the first page.
|
269
288
|
#
|
270
289
|
# If you would like to convert between animated formats, pass nil as your
|
271
290
|
# page and ImageMagick will copy all of the pages.
|
272
291
|
#
|
273
|
-
# @param format [String] The target format... Like 'jpg', 'gif', 'tiff'
|
274
|
-
# @param page [Integer] If this is an animated gif, say which 'page' you
|
275
|
-
# with an integer. Default 0 will convert only the first page; 'nil'
|
276
|
-
# convert all pages.
|
292
|
+
# @param format [String] The target format... Like 'jpg', 'gif', 'tiff' etc.
|
293
|
+
# @param page [Integer] If this is an animated gif, say which 'page' you
|
294
|
+
# want with an integer. Default 0 will convert only the first page; 'nil'
|
295
|
+
# will convert all pages.
|
277
296
|
# @return [nil]
|
278
297
|
def format(format, page = 0)
|
279
298
|
run_queue if @command_queued
|
@@ -300,12 +319,14 @@ module MiniMagick
|
|
300
319
|
run_command('mogrify', '-quality', '100', "#{path}[0]")
|
301
320
|
end
|
302
321
|
|
303
|
-
# Writes the temporary file out to either a file location (by passing in a
|
304
|
-
# passing in a Stream that you can #write(chunk) to
|
322
|
+
# Writes the temporary file out to either a file location (by passing in a
|
323
|
+
# String) or by passing in a Stream that you can #write(chunk) to
|
324
|
+
# repeatedly
|
305
325
|
#
|
306
|
-
# @param output_to [IOStream, String] Some kind of stream object that needs
|
307
|
-
#
|
308
|
-
#
|
326
|
+
# @param output_to [IOStream, String] Some kind of stream object that needs
|
327
|
+
# to be read or a file path as a String
|
328
|
+
# @return [IOStream, Boolean] If you pass in a file location [String] then
|
329
|
+
# you get a success boolean. If its a stream, you get it back.
|
309
330
|
def write(output_to)
|
310
331
|
run_queue if @command_queued
|
311
332
|
|
@@ -313,7 +334,7 @@ module MiniMagick
|
|
313
334
|
FileUtils.copy_file path, output_to
|
314
335
|
if MiniMagick.validate_on_write
|
315
336
|
run_command(
|
316
|
-
'identify', MiniMagick::Utilities.
|
337
|
+
'identify', MiniMagick::Utilities.path(output_to.to_s)
|
317
338
|
) # Verify that we have a good image
|
318
339
|
end
|
319
340
|
else # stream
|
@@ -344,14 +365,17 @@ module MiniMagick
|
|
344
365
|
'image/' + format.to_s.downcase
|
345
366
|
end
|
346
367
|
|
347
|
-
# If an unknown method is called then it is sent through the mogrify
|
348
|
-
#
|
368
|
+
# If an unknown method is called then it is sent through the mogrify
|
369
|
+
# program.
|
370
|
+
#
|
371
|
+
# @see http://www.imagemagick.org/script/mogrify.php
|
349
372
|
def method_missing(symbol, *args)
|
350
373
|
@queue.send(symbol, *args)
|
351
374
|
@command_queued = true
|
352
375
|
end
|
353
376
|
|
354
|
-
# You can use multiple commands together using this method. Very easy to
|
377
|
+
# You can use multiple commands together using this method. Very easy to
|
378
|
+
# use!
|
355
379
|
#
|
356
380
|
# @example
|
357
381
|
# image.combine_options do |c|
|
@@ -393,7 +417,7 @@ module MiniMagick
|
|
393
417
|
|
394
418
|
if command == 'identify'
|
395
419
|
args.unshift '-ping' # -ping "efficiently determine image characteristics."
|
396
|
-
args.unshift '-quiet' if MiniMagick.mogrify? # graphicsmagick has no -quiet option.
|
420
|
+
args.unshift '-quiet' if MiniMagick.mogrify? && !MiniMagick.debug # graphicsmagick has no -quiet option.
|
397
421
|
end
|
398
422
|
|
399
423
|
run(CommandBuilder.new(command, *args))
|
@@ -423,20 +447,15 @@ module MiniMagick
|
|
423
447
|
|
424
448
|
def destroy!
|
425
449
|
return if @tempfile.nil?
|
426
|
-
File.unlink(path) if File.exist?(path)
|
450
|
+
File.unlink(@path) if File.exist?(@path)
|
427
451
|
@tempfile = nil
|
428
452
|
end
|
429
453
|
|
430
454
|
private
|
431
455
|
|
432
456
|
# Sometimes we get back a list of character values
|
433
|
-
def read_character_data(
|
434
|
-
|
435
|
-
result = ''
|
436
|
-
chars.each do |val|
|
437
|
-
result << ('%c' % val.to_i)
|
438
|
-
end
|
439
|
-
result
|
457
|
+
def read_character_data(string)
|
458
|
+
string.scan(/\d+/).map(&:to_i).map(&:chr).join
|
440
459
|
end
|
441
460
|
end
|
442
461
|
end
|