mini_magick 4.13.2 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +71 -104
- data/lib/mini_magick/configuration.rb +4 -136
- data/lib/mini_magick/image/info.rb +7 -60
- data/lib/mini_magick/image.rb +30 -71
- data/lib/mini_magick/shell.rb +14 -45
- data/lib/mini_magick/tool.rb +37 -70
- data/lib/mini_magick/utilities.rb +4 -6
- data/lib/mini_magick/version.rb +3 -3
- data/lib/mini_magick.rb +17 -42
- metadata +6 -19
- data/lib/mini_gmagick.rb +0 -3
- data/lib/mini_magick/tool/animate.rb +0 -14
- data/lib/mini_magick/tool/compare.rb +0 -14
- data/lib/mini_magick/tool/composite.rb +0 -14
- data/lib/mini_magick/tool/conjure.rb +0 -14
- data/lib/mini_magick/tool/convert.rb +0 -14
- data/lib/mini_magick/tool/display.rb +0 -14
- data/lib/mini_magick/tool/identify.rb +0 -14
- data/lib/mini_magick/tool/import.rb +0 -14
- data/lib/mini_magick/tool/magick.rb +0 -14
- data/lib/mini_magick/tool/mogrify.rb +0 -14
- data/lib/mini_magick/tool/mogrify_restricted.rb +0 -15
- data/lib/mini_magick/tool/montage.rb +0 -14
- data/lib/mini_magick/tool/stream.rb +0 -14
@@ -17,8 +17,6 @@ module MiniMagick
|
|
17
17
|
cheap_info(value)
|
18
18
|
when "colorspace"
|
19
19
|
colorspace
|
20
|
-
when "mime_type"
|
21
|
-
mime_type
|
22
20
|
when "resolution"
|
23
21
|
resolution(*args)
|
24
22
|
when "signature"
|
@@ -27,8 +25,6 @@ module MiniMagick
|
|
27
25
|
raw_exif(value)
|
28
26
|
when "exif"
|
29
27
|
exif
|
30
|
-
when "details"
|
31
|
-
details
|
32
28
|
when "data"
|
33
29
|
data
|
34
30
|
else
|
@@ -76,12 +72,6 @@ module MiniMagick
|
|
76
72
|
@info["colorspace"] ||= self["%r"]
|
77
73
|
end
|
78
74
|
|
79
|
-
def mime_type
|
80
|
-
warn "[MiniMagick] MiniMagick::Image#mime_type has been deprecated, because it wasn't returning correct result for all formats ImageMagick supports. Unfortunately, returning the correct MIME type would be very slow, because it would require ImageMagick to read the whole file. It's better to use Marcel and MimeMagic gems, which are able to determine the MIME type just from the image header."
|
81
|
-
|
82
|
-
"image/#{self["format"].downcase}"
|
83
|
-
end
|
84
|
-
|
85
75
|
def resolution(unit = nil)
|
86
76
|
output = identify do |b|
|
87
77
|
b.units unit if unit
|
@@ -102,20 +92,12 @@ module MiniMagick
|
|
102
92
|
output.each_line do |line|
|
103
93
|
line = line.chomp("\n")
|
104
94
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
key, value = match.post_match.split("=", 2)
|
109
|
-
value = decode_comma_separated_ascii_characters(value) if ASCII_ENCODED_EXIF_KEYS.include?(key)
|
110
|
-
hash[key] = value
|
111
|
-
else
|
112
|
-
hash[hash.keys.last] << "\n#{line}"
|
113
|
-
end
|
114
|
-
when :graphicsmagick
|
115
|
-
next if line == "unknown"
|
116
|
-
key, value = line.split("=", 2)
|
117
|
-
value.gsub!("\\012", "\n") # convert "\012" characters to newlines
|
95
|
+
if match = line.match(/^exif:/)
|
96
|
+
key, value = match.post_match.split("=", 2)
|
97
|
+
value = decode_comma_separated_ascii_characters(value) if ASCII_ENCODED_EXIF_KEYS.include?(key)
|
118
98
|
hash[key] = value
|
99
|
+
else
|
100
|
+
hash[hash.keys.last] << "\n#{line}"
|
119
101
|
end
|
120
102
|
end
|
121
103
|
|
@@ -131,44 +113,9 @@ module MiniMagick
|
|
131
113
|
@info["signature"] ||= self["%#"]
|
132
114
|
end
|
133
115
|
|
134
|
-
def details
|
135
|
-
warn "[MiniMagick] MiniMagick::Image#details has been deprecated, as it was causing too many parsing errors. You should use MiniMagick::Image#data instead, which differs in a way that the keys are in camelcase." if MiniMagick.imagemagick? || MiniMagick.imagemagick7?
|
136
|
-
|
137
|
-
@info["details"] ||= (
|
138
|
-
details_string = identify(&:verbose)
|
139
|
-
key_stack = []
|
140
|
-
details_string.lines.to_a[1..-1].each_with_object({}) do |line, details_hash|
|
141
|
-
next if !line.valid_encoding? || line.strip.length.zero?
|
142
|
-
|
143
|
-
level = line[/^\s*/].length / 2 - 1
|
144
|
-
if level >= 0
|
145
|
-
key_stack.pop until key_stack.size <= level
|
146
|
-
else
|
147
|
-
# Some metadata, such as SVG clipping paths, will be saved without
|
148
|
-
# indentation, resulting in a level of -1
|
149
|
-
last_key = details_hash.keys.last
|
150
|
-
details_hash[last_key] = '' if details_hash[last_key].empty?
|
151
|
-
details_hash[last_key] << line
|
152
|
-
next
|
153
|
-
end
|
154
|
-
|
155
|
-
key, _, value = line.partition(/:[\s]/).map(&:strip)
|
156
|
-
hash = key_stack.inject(details_hash) { |_hash, _key| _hash.fetch(_key) }
|
157
|
-
if value.empty?
|
158
|
-
hash[key] = {}
|
159
|
-
key_stack.push key
|
160
|
-
else
|
161
|
-
hash[key] = value
|
162
|
-
end
|
163
|
-
end
|
164
|
-
)
|
165
|
-
end
|
166
|
-
|
167
116
|
def data
|
168
|
-
raise Error, "MiniMagick::Image#data isn't supported on GraphicsMagick. Use MiniMagick::Image#details instead." if MiniMagick.graphicsmagick?
|
169
|
-
|
170
117
|
@info["data"] ||= (
|
171
|
-
json = MiniMagick
|
118
|
+
json = MiniMagick.convert do |convert|
|
172
119
|
convert << path
|
173
120
|
convert << "json:"
|
174
121
|
end
|
@@ -180,7 +127,7 @@ module MiniMagick
|
|
180
127
|
end
|
181
128
|
|
182
129
|
def identify
|
183
|
-
MiniMagick
|
130
|
+
MiniMagick.identify do |builder|
|
184
131
|
yield builder if block_given?
|
185
132
|
builder << path
|
186
133
|
end
|
data/lib/mini_magick/image.rb
CHANGED
@@ -51,11 +51,11 @@ module MiniMagick
|
|
51
51
|
#
|
52
52
|
def self.import_pixels(blob, columns, rows, depth, map, format = 'png')
|
53
53
|
# Create an image object with the raw pixel data string:
|
54
|
-
|
54
|
+
read(blob, ".dat").tap do |image|
|
55
55
|
output_path = image.path.sub(/\.\w+$/, ".#{format}")
|
56
56
|
# Use ImageMagick to convert the raw data file to an image file of the
|
57
57
|
# desired format:
|
58
|
-
MiniMagick
|
58
|
+
MiniMagick.convert do |convert|
|
59
59
|
convert.size "#{columns}x#{rows}"
|
60
60
|
convert.depth depth
|
61
61
|
convert << "#{map}:#{image.path}"
|
@@ -79,33 +79,15 @@ module MiniMagick
|
|
79
79
|
# @param options [Hash] Specify options for the open method
|
80
80
|
# @return [MiniMagick::Image] The loaded image
|
81
81
|
#
|
82
|
-
def self.open(path_or_url, ext = nil, options
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
if path_or_url.respond_to?(:open)
|
88
|
-
path_or_url
|
89
|
-
elsif path_or_url.respond_to?(:to_str) &&
|
90
|
-
%r{\A[A-Za-z][A-Za-z0-9+\-\.]*://} =~ path_or_url &&
|
91
|
-
(uri = URI.parse(path_or_url)).respond_to?(:open)
|
92
|
-
uri
|
93
|
-
else
|
94
|
-
options = { binmode: true }.merge(options)
|
95
|
-
Pathname(path_or_url)
|
96
|
-
end
|
97
|
-
|
98
|
-
if openable.is_a?(URI::Generic)
|
99
|
-
ext ||= File.extname(openable.path)
|
100
|
-
else
|
101
|
-
ext ||= File.extname(openable.to_s)
|
102
|
-
end
|
103
|
-
ext.sub!(/:.*/, '') # hack for filenames or URLs that include a colon
|
104
|
-
|
105
|
-
if openable.is_a?(URI::Generic)
|
106
|
-
openable.open(options) { |file| read(file, ext) }
|
82
|
+
def self.open(path_or_url, ext = nil, **options)
|
83
|
+
if path_or_url.to_s =~ %r{\A(https?|ftp)://}
|
84
|
+
uri = URI(path_or_url)
|
85
|
+
ext ||= File.extname(uri.path).sub(/:.*/, '') # handle URL including a colon
|
86
|
+
uri.open(options) { |file| read(file, ext) }
|
107
87
|
else
|
108
|
-
|
88
|
+
pathname = Pathname(path_or_url)
|
89
|
+
ext ||= File.extname(pathname.to_s)
|
90
|
+
pathname.open(binmode: true, **options) { |file| read(file, ext) }
|
109
91
|
end
|
110
92
|
end
|
111
93
|
|
@@ -118,18 +100,14 @@ module MiniMagick
|
|
118
100
|
# we have a good tempfile.
|
119
101
|
#
|
120
102
|
# @param ext [String] Specify the extension you want to read it as
|
121
|
-
# @param validate [Boolean] If false, skips validation of the created
|
122
|
-
# image. Defaults to true.
|
123
103
|
# @yield [Tempfile] You can #write bits to this object to create the new
|
124
104
|
# Image
|
125
105
|
# @return [MiniMagick::Image] The created image
|
126
106
|
#
|
127
|
-
def self.create(ext = nil,
|
107
|
+
def self.create(ext = nil, &block)
|
128
108
|
tempfile = MiniMagick::Utilities.tempfile(ext.to_s.downcase, &block)
|
129
109
|
|
130
|
-
new(tempfile.path, tempfile)
|
131
|
-
image.validate! if validate
|
132
|
-
end
|
110
|
+
new(tempfile.path, tempfile)
|
133
111
|
end
|
134
112
|
|
135
113
|
##
|
@@ -164,7 +142,7 @@ module MiniMagick
|
|
164
142
|
# which creates a temporary file for you and protects your original.
|
165
143
|
#
|
166
144
|
# @param input_path [String, Pathname] The location of an image file
|
167
|
-
# @yield [MiniMagick::Tool
|
145
|
+
# @yield [MiniMagick::Tool] If block is given, {#combine_options}
|
168
146
|
# is called.
|
169
147
|
#
|
170
148
|
def initialize(input_path, tempfile = nil, &block)
|
@@ -228,10 +206,6 @@ module MiniMagick
|
|
228
206
|
#
|
229
207
|
attribute :type, "format"
|
230
208
|
##
|
231
|
-
# @return [String]
|
232
|
-
#
|
233
|
-
attribute :mime_type
|
234
|
-
##
|
235
209
|
# @return [Integer]
|
236
210
|
#
|
237
211
|
attribute :width
|
@@ -286,17 +260,10 @@ module MiniMagick
|
|
286
260
|
#
|
287
261
|
attribute :signature
|
288
262
|
##
|
289
|
-
# Returns the
|
290
|
-
# ImageMagick.
|
263
|
+
# Returns the result of converting the image to JSON format.
|
291
264
|
#
|
292
265
|
# @return [Hash]
|
293
266
|
attribute :data
|
294
|
-
##
|
295
|
-
# Returns the information from `identify -verbose` in a Hash format, for
|
296
|
-
# GraphicsMagick.
|
297
|
-
#
|
298
|
-
# @return [Hash]
|
299
|
-
attribute :details
|
300
267
|
|
301
268
|
##
|
302
269
|
# Use this method if you want to access raw Identify's format API.
|
@@ -367,7 +334,7 @@ module MiniMagick
|
|
367
334
|
# @return [Array] Matrix of each color of each pixel
|
368
335
|
def get_pixels(map="RGB")
|
369
336
|
raise ArgumentError, "Invalid map value" unless ["RGB", "RGBA"].include?(map)
|
370
|
-
convert = MiniMagick
|
337
|
+
convert = MiniMagick.convert
|
371
338
|
convert << path
|
372
339
|
convert.depth(8)
|
373
340
|
convert << "#{map}:-"
|
@@ -397,10 +364,10 @@ module MiniMagick
|
|
397
364
|
# @example
|
398
365
|
# # It is given in readme.md file
|
399
366
|
##
|
400
|
-
def self.get_image_from_pixels(pixels, dimension, map, depth,
|
367
|
+
def self.get_image_from_pixels(pixels, dimension, map, depth, format)
|
401
368
|
pixels = pixels.flatten
|
402
369
|
blob = pixels.pack('C*')
|
403
|
-
import_pixels(blob, *dimension, depth, map,
|
370
|
+
import_pixels(blob, *dimension, depth, map, format)
|
404
371
|
end
|
405
372
|
|
406
373
|
##
|
@@ -426,7 +393,7 @@ module MiniMagick
|
|
426
393
|
# will convert all pages.
|
427
394
|
# @param read_opts [Hash] Any read options to be passed to ImageMagick
|
428
395
|
# for example: image.format('jpg', page, {density: '300'})
|
429
|
-
# @yield [MiniMagick::Tool
|
396
|
+
# @yield [MiniMagick::Tool] It optionally yields the command,
|
430
397
|
# if you want to add something.
|
431
398
|
# @return [self]
|
432
399
|
#
|
@@ -441,7 +408,7 @@ module MiniMagick
|
|
441
408
|
input_path = path.dup
|
442
409
|
input_path << "[#{page}]" if page && !layer?
|
443
410
|
|
444
|
-
MiniMagick
|
411
|
+
MiniMagick.convert do |convert|
|
445
412
|
read_opts.each do |opt, val|
|
446
413
|
convert.send(opt.to_s, val)
|
447
414
|
end
|
@@ -477,7 +444,7 @@ module MiniMagick
|
|
477
444
|
# c.background "blue"
|
478
445
|
# end
|
479
446
|
#
|
480
|
-
# @yield [MiniMagick::
|
447
|
+
# @yield [MiniMagick::Command]
|
481
448
|
# @see http://www.imagemagick.org/script/mogrify.php
|
482
449
|
# @return [self]
|
483
450
|
#
|
@@ -498,10 +465,6 @@ module MiniMagick
|
|
498
465
|
end
|
499
466
|
end
|
500
467
|
|
501
|
-
def respond_to_missing?(method_name, include_private = false)
|
502
|
-
MiniMagick::Tool::Mogrify.option_methods.include?(method_name.to_s)
|
503
|
-
end
|
504
|
-
|
505
468
|
##
|
506
469
|
# Writes the temporary file out to either a file location (by passing in a
|
507
470
|
# String) or by passing in a Stream that you can #write(chunk) to
|
@@ -514,7 +477,7 @@ module MiniMagick
|
|
514
477
|
case output_to
|
515
478
|
when String, Pathname
|
516
479
|
if layer?
|
517
|
-
MiniMagick
|
480
|
+
MiniMagick.convert do |builder|
|
518
481
|
builder << path
|
519
482
|
builder << output_to
|
520
483
|
end
|
@@ -524,6 +487,8 @@ module MiniMagick
|
|
524
487
|
else
|
525
488
|
IO.copy_stream File.open(path, "rb"), output_to
|
526
489
|
end
|
490
|
+
ensure
|
491
|
+
destroy! if tempfile
|
527
492
|
end
|
528
493
|
|
529
494
|
##
|
@@ -541,7 +506,7 @@ module MiniMagick
|
|
541
506
|
def composite(other_image, output_extension = type.downcase, mask = nil)
|
542
507
|
output_tempfile = MiniMagick::Utilities.tempfile(".#{output_extension}")
|
543
508
|
|
544
|
-
MiniMagick
|
509
|
+
MiniMagick.composite do |composite|
|
545
510
|
yield composite if block_given?
|
546
511
|
composite << other_image.path
|
547
512
|
composite << path
|
@@ -583,27 +548,21 @@ module MiniMagick
|
|
583
548
|
# b.verbose
|
584
549
|
# end # runs `identify -verbose image.jpg`
|
585
550
|
# @return [String] Output from `identify`
|
586
|
-
# @yield [MiniMagick::Tool
|
551
|
+
# @yield [MiniMagick::Tool]
|
587
552
|
#
|
588
553
|
def identify
|
589
|
-
MiniMagick
|
554
|
+
MiniMagick.identify do |builder|
|
590
555
|
yield builder if block_given?
|
591
556
|
builder << path
|
592
557
|
end
|
593
558
|
end
|
594
559
|
|
595
|
-
# @private
|
596
|
-
def run_command(tool_name, *args)
|
597
|
-
MiniMagick::Tool.const_get(tool_name.capitalize).new do |builder|
|
598
|
-
args.each do |arg|
|
599
|
-
builder << arg
|
600
|
-
end
|
601
|
-
end
|
602
|
-
end
|
603
|
-
|
604
560
|
def mogrify(page = nil)
|
605
|
-
MiniMagick
|
561
|
+
MiniMagick.mogrify do |builder|
|
606
562
|
yield builder if block_given?
|
563
|
+
if builder.args.include?("-format")
|
564
|
+
fail MiniMagick::Error, "you must call #format on a MiniMagick::Image directly"
|
565
|
+
end
|
607
566
|
builder << (page ? "#{path}[#{page}]" : path)
|
608
567
|
end
|
609
568
|
|
data/lib/mini_magick/shell.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "open3"
|
2
2
|
require "benchmark"
|
3
3
|
|
4
4
|
module MiniMagick
|
@@ -10,24 +10,26 @@ module MiniMagick
|
|
10
10
|
#
|
11
11
|
class Shell
|
12
12
|
|
13
|
-
def run(command,
|
14
|
-
stdout, stderr, status = execute(command,
|
13
|
+
def run(command, errors: MiniMagick.errors, warnings: MiniMagick.warnings, **options)
|
14
|
+
stdout, stderr, status = execute(command, **options)
|
15
15
|
|
16
|
-
if status != 0
|
17
|
-
|
16
|
+
if status != 0
|
17
|
+
if stderr.include?("time limit exceeded")
|
18
|
+
fail MiniMagick::TimeoutError, "`#{command.join(" ")}` has timed out"
|
19
|
+
elsif errors
|
20
|
+
fail MiniMagick::Error, "`#{command.join(" ")}` failed with status: #{status.inspect} and error:\n#{stderr}"
|
21
|
+
end
|
18
22
|
end
|
19
23
|
|
20
|
-
stderr
|
21
|
-
$stderr.print(stderr) unless options[:stderr] == false
|
24
|
+
$stderr.print(stderr) if warnings && stderr.strip != %(WARNING: The convert command is deprecated in IMv7, use "magick")
|
22
25
|
|
23
26
|
[stdout, stderr, status]
|
24
27
|
end
|
25
28
|
|
26
|
-
def execute(command,
|
27
|
-
stdout, stderr, status =
|
28
|
-
|
29
|
-
|
30
|
-
end
|
29
|
+
def execute(command, stdin: "", timeout: MiniMagick.timeout)
|
30
|
+
stdout, stderr, status = log(command.join(" ")) do
|
31
|
+
Open3.capture3({ "MAGICK_TIME_LIMIT" => timeout&.to_s }, *command, stdin_data: stdin)
|
32
|
+
end
|
31
33
|
|
32
34
|
[stdout, stderr, status&.exitstatus]
|
33
35
|
rescue Errno::ENOENT, IOError
|
@@ -36,39 +38,6 @@ module MiniMagick
|
|
36
38
|
|
37
39
|
private
|
38
40
|
|
39
|
-
def execute_open3(command, options = {})
|
40
|
-
require "open3"
|
41
|
-
|
42
|
-
# We would ideally use Open3.capture3, but it wouldn't allow us to
|
43
|
-
# terminate the command after timing out.
|
44
|
-
Open3.popen3(*command) do |in_w, out_r, err_r, thread|
|
45
|
-
[in_w, out_r, err_r].each(&:binmode)
|
46
|
-
stdout_reader = Thread.new { out_r.read }
|
47
|
-
stderr_reader = Thread.new { err_r.read }
|
48
|
-
begin
|
49
|
-
in_w.write options[:stdin].to_s
|
50
|
-
rescue Errno::EPIPE
|
51
|
-
end
|
52
|
-
in_w.close
|
53
|
-
|
54
|
-
unless thread.join(MiniMagick.timeout)
|
55
|
-
Process.kill("TERM", thread.pid) rescue nil
|
56
|
-
Process.waitpid(thread.pid) rescue nil
|
57
|
-
raise Timeout::Error, "MiniMagick command timed out: #{command}"
|
58
|
-
end
|
59
|
-
|
60
|
-
[stdout_reader.value, stderr_reader.value, thread.value]
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def execute_posix_spawn(command, options = {})
|
65
|
-
require "posix-spawn"
|
66
|
-
child = POSIX::Spawn::Child.new(*command, input: options[:stdin].to_s, timeout: MiniMagick.timeout)
|
67
|
-
[child.out, child.err, child.status]
|
68
|
-
rescue POSIX::Spawn::TimeoutExceeded
|
69
|
-
raise Timeout::Error, "MiniMagick command timed out: #{command}"
|
70
|
-
end
|
71
|
-
|
72
41
|
def log(command, &block)
|
73
42
|
value = nil
|
74
43
|
duration = Benchmark.realtime { value = block.call }
|
data/lib/mini_magick/tool.rb
CHANGED
@@ -2,15 +2,13 @@ require "mini_magick/shell"
|
|
2
2
|
|
3
3
|
module MiniMagick
|
4
4
|
##
|
5
|
-
#
|
6
|
-
#
|
7
|
-
# this class if you want to be closer to the metal and execute ImageMagick
|
8
|
-
# commands directly, but still with a nice Ruby interface.
|
5
|
+
# Class that wraps command-line tools directly, as opposed MiniMagick::Image
|
6
|
+
# which is more high-level.
|
9
7
|
#
|
10
8
|
# @example
|
11
|
-
# MiniMagick
|
12
|
-
#
|
13
|
-
#
|
9
|
+
# MiniMagick.mogrify do |mogrify|
|
10
|
+
# mogrify.resize "500x500"
|
11
|
+
# mogrify << "path/to/image.jpg"
|
14
12
|
# end
|
15
13
|
#
|
16
14
|
class Tool
|
@@ -23,8 +21,7 @@ module MiniMagick
|
|
23
21
|
# executes the command in the end.
|
24
22
|
#
|
25
23
|
# @example
|
26
|
-
#
|
27
|
-
# puts version
|
24
|
+
# puts MiniMagick.identify(&:version)
|
28
25
|
#
|
29
26
|
# @return [MiniMagick::Tool, String] If no block is given, returns an
|
30
27
|
# instance of the tool, if block is given, returns the output of the
|
@@ -46,31 +43,31 @@ module MiniMagick
|
|
46
43
|
|
47
44
|
# @param name [String]
|
48
45
|
# @param options [Hash]
|
49
|
-
# @option options [Boolean] :
|
46
|
+
# @option options [Boolean] :errors Whether to raise errors on non-zero
|
50
47
|
# exit codes.
|
48
|
+
# @option options [Boolean] :warnings Whether to print warnings to stderrr.
|
49
|
+
# @option options [String] :stdin Content to send to standard input stream.
|
51
50
|
# @example
|
52
|
-
# MiniMagick
|
51
|
+
# MiniMagick.identify(errors: false) do |identify|
|
53
52
|
# identify.help # returns exit status 1, which would otherwise throw an error
|
54
53
|
# end
|
55
|
-
def initialize(name, options
|
56
|
-
|
57
|
-
|
58
|
-
@
|
59
|
-
@args = []
|
60
|
-
@whiny = options.is_a?(Hash) ? options.fetch(:whiny, MiniMagick.whiny) : options
|
54
|
+
def initialize(name, **options)
|
55
|
+
@name = name
|
56
|
+
@args = []
|
57
|
+
@options = options
|
61
58
|
end
|
62
59
|
|
63
60
|
##
|
64
61
|
# Executes the command that has been built up.
|
65
62
|
#
|
66
63
|
# @example
|
67
|
-
# mogrify = MiniMagick
|
64
|
+
# mogrify = MiniMagick.mogrify
|
68
65
|
# mogrify.resize("500x500")
|
69
66
|
# mogrify << "path/to/image.jpg"
|
70
67
|
# mogrify.call # executes `mogrify -resize 500x500 path/to/image.jpg`
|
71
68
|
#
|
72
69
|
# @example
|
73
|
-
# mogrify = MiniMagick
|
70
|
+
# mogrify = MiniMagick.mogrify
|
74
71
|
# # build the command
|
75
72
|
# mogrify.call do |stdout, stderr, status|
|
76
73
|
# # ...
|
@@ -80,16 +77,12 @@ module MiniMagick
|
|
80
77
|
#
|
81
78
|
# @return [String] Returns the output of the command
|
82
79
|
#
|
83
|
-
def call(
|
84
|
-
options =
|
85
|
-
|
86
|
-
whiny = args.fetch(0, @whiny)
|
87
|
-
|
88
|
-
options[:whiny] = whiny
|
89
|
-
options[:stderr] = MiniMagick.warnings && !block_given?
|
80
|
+
def call(**options)
|
81
|
+
options = @options.merge(options)
|
82
|
+
options[:warnings] = false if block_given?
|
90
83
|
|
91
84
|
shell = MiniMagick::Shell.new
|
92
|
-
stdout, stderr, status = shell.run(command, options)
|
85
|
+
stdout, stderr, status = shell.run(command, **options)
|
93
86
|
yield stdout, stderr, status if block_given?
|
94
87
|
|
95
88
|
stdout.chomp("\n")
|
@@ -101,7 +94,7 @@ module MiniMagick
|
|
101
94
|
# @return [Array<String>]
|
102
95
|
#
|
103
96
|
# @example
|
104
|
-
# mogrify = MiniMagick
|
97
|
+
# mogrify = MiniMagick.mogrify
|
105
98
|
# mogrify.resize "500x500"
|
106
99
|
# mogrify.contrast
|
107
100
|
# mogrify.command #=> ["mogrify", "-resize", "500x500", "-contrast"]
|
@@ -112,29 +105,24 @@ module MiniMagick
|
|
112
105
|
|
113
106
|
##
|
114
107
|
# The executable used for this tool. Respects
|
115
|
-
# {MiniMagick::Configuration#
|
116
|
-
# and {MiniMagick::Configuration#cli_prefix}.
|
108
|
+
# {MiniMagick::Configuration#cli_prefix}.
|
117
109
|
#
|
118
110
|
# @return [Array<String>]
|
119
111
|
#
|
120
112
|
# @example
|
121
|
-
#
|
122
|
-
# identify
|
123
|
-
# identify.executable #=> ["gm", "identify"]
|
113
|
+
# identify = MiniMagick.identify
|
114
|
+
# identify.executable #=> ["magick", "identify"]
|
124
115
|
#
|
125
116
|
# @example
|
126
117
|
# MiniMagick.configure do |config|
|
127
|
-
# config.cli = :graphicsmagick
|
128
118
|
# config.cli_prefix = ['firejail', '--force']
|
129
119
|
# end
|
130
|
-
# identify = MiniMagick
|
131
|
-
# identify.executable #=> ["firejail", "--force", "
|
120
|
+
# identify = MiniMagick.identify
|
121
|
+
# identify.executable #=> ["firejail", "--force", "magick", "identify"]
|
132
122
|
#
|
133
123
|
def executable
|
134
124
|
exe = [name]
|
135
125
|
exe.unshift "magick" if MiniMagick.imagemagick7? && name != "magick"
|
136
|
-
exe.unshift "gm" if MiniMagick.graphicsmagick?
|
137
|
-
exe.unshift File.join(MiniMagick.cli_path, exe.shift) if MiniMagick.cli_path
|
138
126
|
Array(MiniMagick.cli_prefix).reverse_each { |p| exe.unshift p } if MiniMagick.cli_prefix
|
139
127
|
exe
|
140
128
|
end
|
@@ -163,7 +151,7 @@ module MiniMagick
|
|
163
151
|
# Changes the last operator to its "plus" form.
|
164
152
|
#
|
165
153
|
# @example
|
166
|
-
# MiniMagick
|
154
|
+
# MiniMagick.mogrify do |mogrify|
|
167
155
|
# mogrify.antialias.+
|
168
156
|
# mogrify.distort.+("Perspective", "0,0,4,5 89,0,45,46")
|
169
157
|
# end
|
@@ -181,7 +169,7 @@ module MiniMagick
|
|
181
169
|
# Create an ImageMagick stack in the command (surround.
|
182
170
|
#
|
183
171
|
# @example
|
184
|
-
# MiniMagick
|
172
|
+
# MiniMagick.convert do |convert|
|
185
173
|
# convert << "wand.gif"
|
186
174
|
# convert.stack do |stack|
|
187
175
|
# stack << "wand.gif"
|
@@ -208,7 +196,7 @@ module MiniMagick
|
|
208
196
|
# Adds ImageMagick's pseudo-filename `-` for standard input.
|
209
197
|
#
|
210
198
|
# @example
|
211
|
-
# identify = MiniMagick
|
199
|
+
# identify = MiniMagick.identify
|
212
200
|
# identify.stdin
|
213
201
|
# identify.call(stdin: image_content)
|
214
202
|
# # executes `identify -` with the given standard input
|
@@ -221,7 +209,7 @@ module MiniMagick
|
|
221
209
|
# Adds ImageMagick's pseudo-filename `-` for standard output.
|
222
210
|
#
|
223
211
|
# @example
|
224
|
-
# content = MiniMagick
|
212
|
+
# content = MiniMagick.convert do |convert|
|
225
213
|
# convert << "input.jpg"
|
226
214
|
# convert.auto_orient
|
227
215
|
# convert.stdout
|
@@ -273,35 +261,14 @@ module MiniMagick
|
|
273
261
|
self
|
274
262
|
end
|
275
263
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
cli_options = help_page.scan(/^\s+-[a-z\-]+/).map(&:strip)
|
283
|
-
if tool.name == "mogrify" && MiniMagick.graphicsmagick?
|
284
|
-
# These options were undocumented before 2015-06-14 (see gm bug 302)
|
285
|
-
cli_options |= %w[-box -convolve -gravity -linewidth -mattecolor -render -shave]
|
264
|
+
# deprecated tool subclasses
|
265
|
+
%w[animate compare composite conjure convert display identify import magick mogrify montage stream].each do |tool|
|
266
|
+
const_set(tool.capitalize, Class.new(self) {
|
267
|
+
define_method(:initialize) do |*args|
|
268
|
+
super(tool, *args)
|
286
269
|
end
|
287
|
-
|
288
|
-
|
289
|
-
)
|
270
|
+
})
|
271
|
+
deprecate_constant(tool.capitalize)
|
290
272
|
end
|
291
|
-
|
292
273
|
end
|
293
274
|
end
|
294
|
-
|
295
|
-
require "mini_magick/tool/animate"
|
296
|
-
require "mini_magick/tool/compare"
|
297
|
-
require "mini_magick/tool/composite"
|
298
|
-
require "mini_magick/tool/conjure"
|
299
|
-
require "mini_magick/tool/convert"
|
300
|
-
require "mini_magick/tool/display"
|
301
|
-
require "mini_magick/tool/identify"
|
302
|
-
require "mini_magick/tool/import"
|
303
|
-
require "mini_magick/tool/magick"
|
304
|
-
require "mini_magick/tool/mogrify"
|
305
|
-
require "mini_magick/tool/mogrify_restricted"
|
306
|
-
require "mini_magick/tool/montage"
|
307
|
-
require "mini_magick/tool/stream"
|
@@ -24,12 +24,10 @@ module MiniMagick
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def tempfile(extension)
|
27
|
-
Tempfile.new(["mini_magick", extension], MiniMagick.tmpdir
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
27
|
+
tempfile = Tempfile.new(["mini_magick", extension], MiniMagick.tmpdir, binmode: true)
|
28
|
+
yield tempfile if block_given?
|
29
|
+
tempfile.close
|
30
|
+
tempfile
|
32
31
|
end
|
33
|
-
|
34
32
|
end
|
35
33
|
end
|