mini_magick 4.10.1 → 4.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/mini_magick/configuration.rb +8 -8
- data/lib/mini_magick/image/info.rb +11 -1
- data/lib/mini_magick/image.rb +33 -5
- data/lib/mini_magick/shell.rb +3 -5
- data/lib/mini_magick/tool.rb +16 -6
- data/lib/mini_magick/utilities.rb +1 -1
- data/lib/mini_magick/version.rb +2 -2
- metadata +6 -7
- data/lib/mini_magick/immutable_image.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20aea50f08b4b5c234dc8167e3b8f344b3bb5e279e4d28857ce38d2acbdc0772
|
4
|
+
data.tar.gz: 513048f1e3315516fe592da1ecb3dec41f8e7a55e8165fe37db0720a297c5daa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5e8d72969c3649b4514a5b53fb5d228fb5db58bd9bdef0b7457838ed1289e62c8a6c0ec28cda9463fc16a159724d024a23043de5a377c2824f5bc9b148a627d
|
7
|
+
data.tar.gz: 28e78716378e97ba8c57758cb684b0428d734c1e5163f626a53b38f52c8f133db7fe0f041727c3a5ee200d241cdbd9409986caacc49746d361905c76a4bfed38
|
@@ -4,14 +4,6 @@ require 'logger'
|
|
4
4
|
module MiniMagick
|
5
5
|
module Configuration
|
6
6
|
|
7
|
-
##
|
8
|
-
# Set whether you want to use [ImageMagick](http://www.imagemagick.org) or
|
9
|
-
# [GraphicsMagick](http://www.graphicsmagick.org).
|
10
|
-
#
|
11
|
-
# @return [Symbol] `:imagemagick`, `:imagemagick7`, or `:graphicsmagick`
|
12
|
-
#
|
13
|
-
attr_accessor :cli
|
14
|
-
|
15
7
|
##
|
16
8
|
# If you don't have the CLI tools in your PATH, you can set the path to the
|
17
9
|
# executables.
|
@@ -53,6 +45,13 @@ module MiniMagick
|
|
53
45
|
# @return [Logger]
|
54
46
|
#
|
55
47
|
attr_accessor :logger
|
48
|
+
##
|
49
|
+
# Temporary directory used by MiniMagick, default is `Dir.tmpdir`, but
|
50
|
+
# you can override it.
|
51
|
+
#
|
52
|
+
# @return [String]
|
53
|
+
#
|
54
|
+
attr_accessor :tmpdir
|
56
55
|
|
57
56
|
##
|
58
57
|
# If set to `true`, it will `identify` every newly created image, and raise
|
@@ -90,6 +89,7 @@ module MiniMagick
|
|
90
89
|
attr_accessor :shell_api
|
91
90
|
|
92
91
|
def self.extended(base)
|
92
|
+
base.tmpdir = Dir.tmpdir
|
93
93
|
base.validate_on_create = true
|
94
94
|
base.validate_on_write = true
|
95
95
|
base.whiny = true
|
@@ -42,7 +42,7 @@ module MiniMagick
|
|
42
42
|
|
43
43
|
def cheap_info(value)
|
44
44
|
@info.fetch(value) do
|
45
|
-
format, width, height, size = self["%m %w %h %b"].split(" ")
|
45
|
+
format, width, height, size = parse_warnings(self["%m %w %h %b"]).split(" ")
|
46
46
|
|
47
47
|
path = @path
|
48
48
|
path = path.match(/\[\d+\]$/).pre_match if path =~ /\[\d+\]$/
|
@@ -62,6 +62,16 @@ module MiniMagick
|
|
62
62
|
raise MiniMagick::Invalid, "image data can't be read"
|
63
63
|
end
|
64
64
|
|
65
|
+
def parse_warnings(raw_info)
|
66
|
+
return raw_info unless raw_info.split("\n").size > 1
|
67
|
+
|
68
|
+
raw_info.split("\n").each do |line|
|
69
|
+
# must match "%m %w %h %b"
|
70
|
+
return line if line.match?(/^[A-Z]+ \d+ \d+ \d+(|\.\d+)([KMGTPEZY]{0,1})B$/)
|
71
|
+
end
|
72
|
+
raise TypeError
|
73
|
+
end
|
74
|
+
|
65
75
|
def colorspace
|
66
76
|
@info["colorspace"] ||= self["%r"]
|
67
77
|
end
|
data/lib/mini_magick/image.rb
CHANGED
@@ -15,7 +15,7 @@ module MiniMagick
|
|
15
15
|
# methods.
|
16
16
|
#
|
17
17
|
# Use this to pass in a stream object. Must respond to #read(size) or be a
|
18
|
-
# binary string object (
|
18
|
+
# binary string object (BLOB)
|
19
19
|
#
|
20
20
|
# Probably easier to use the {.open} method if you want to open a file or a
|
21
21
|
# URL.
|
@@ -340,13 +340,18 @@ module MiniMagick
|
|
340
340
|
#
|
341
341
|
# 1) one for each row of pixels
|
342
342
|
# 2) one for each column of pixels
|
343
|
-
# 3) three elements in the range 0-255, one for each of the RGB color channels
|
343
|
+
# 3) three or four elements in the range 0-255, one for each of the RGB(A) color channels
|
344
344
|
#
|
345
345
|
# @example
|
346
346
|
# img = MiniMagick::Image.open 'image.jpg'
|
347
347
|
# pixels = img.get_pixels
|
348
348
|
# pixels[3][2][1] # the green channel value from the 4th-row, 3rd-column pixel
|
349
349
|
#
|
350
|
+
# @example
|
351
|
+
# img = MiniMagick::Image.open 'image.jpg'
|
352
|
+
# pixels = img.get_pixels("RGBA")
|
353
|
+
# pixels[3][2][3] # the alpha channel value from the 4th-row, 3rd-column pixel
|
354
|
+
#
|
350
355
|
# It can also be called after applying transformations:
|
351
356
|
#
|
352
357
|
# @example
|
@@ -357,19 +362,22 @@ module MiniMagick
|
|
357
362
|
#
|
358
363
|
# In this example, all pixels in pix should now have equal R, G, and B values.
|
359
364
|
#
|
365
|
+
# @param map [String] A code for the mapping of the pixel data. Must be either
|
366
|
+
# 'RGB' or 'RGBA'. Default to 'RGB'
|
360
367
|
# @return [Array] Matrix of each color of each pixel
|
361
|
-
def get_pixels
|
368
|
+
def get_pixels(map="RGB")
|
369
|
+
raise ArgumentError, "Invalid map value" unless ["RGB", "RGBA"].include?(map)
|
362
370
|
convert = MiniMagick::Tool::Convert.new
|
363
371
|
convert << path
|
364
372
|
convert.depth(8)
|
365
|
-
convert << "
|
373
|
+
convert << "#{map}:-"
|
366
374
|
|
367
375
|
# Do not use `convert.call` here. We need the whole binary (unstripped) output here.
|
368
376
|
shell = MiniMagick::Shell.new
|
369
377
|
output, * = shell.run(convert.command)
|
370
378
|
|
371
379
|
pixels_array = output.unpack("C*")
|
372
|
-
pixels = pixels_array.each_slice(
|
380
|
+
pixels = pixels_array.each_slice(map.length).each_slice(width).to_a
|
373
381
|
|
374
382
|
# deallocate large intermediary objects
|
375
383
|
output.clear
|
@@ -378,6 +386,23 @@ module MiniMagick
|
|
378
386
|
pixels
|
379
387
|
end
|
380
388
|
|
389
|
+
##
|
390
|
+
# This is used to create image from pixels. This might be required if you
|
391
|
+
# create pixels for some image processing reasons and you want to form
|
392
|
+
# image from those pixels.
|
393
|
+
#
|
394
|
+
# *DANGER*: This operation can be very expensive. Please try to use with
|
395
|
+
# caution.
|
396
|
+
#
|
397
|
+
# @example
|
398
|
+
# # It is given in readme.md file
|
399
|
+
##
|
400
|
+
def self.get_image_from_pixels(pixels, dimension, map, depth, mime_type)
|
401
|
+
pixels = pixels.flatten
|
402
|
+
blob = pixels.pack('C*')
|
403
|
+
import_pixels(blob, *dimension, depth, map, mime_type)
|
404
|
+
end
|
405
|
+
|
381
406
|
##
|
382
407
|
# This is used to change the format of the image. That is, from "tiff to
|
383
408
|
# jpg" or something like that. Once you run it, the instance is pointing to
|
@@ -436,6 +461,9 @@ module MiniMagick
|
|
436
461
|
@info.clear
|
437
462
|
|
438
463
|
self
|
464
|
+
rescue MiniMagick::Invalid, MiniMagick::Error => e
|
465
|
+
new_tempfile.unlink if new_tempfile && @tempfile != new_tempfile
|
466
|
+
raise e
|
439
467
|
end
|
440
468
|
|
441
469
|
##
|
data/lib/mini_magick/shell.rb
CHANGED
@@ -14,7 +14,7 @@ module MiniMagick
|
|
14
14
|
stdout, stderr, status = execute(command, stdin: options[:stdin])
|
15
15
|
|
16
16
|
if status != 0 && options.fetch(:whiny, MiniMagick.whiny)
|
17
|
-
fail MiniMagick::Error, "`#{command.join(" ")}` failed with error:\n#{stderr}"
|
17
|
+
fail MiniMagick::Error, "`#{command.join(" ")}` failed with status: #{status} and error:\n#{stderr}"
|
18
18
|
end
|
19
19
|
|
20
20
|
$stderr.print(stderr) unless options[:stderr] == false
|
@@ -25,7 +25,7 @@ module MiniMagick
|
|
25
25
|
def execute(command, options = {})
|
26
26
|
stdout, stderr, status =
|
27
27
|
log(command.join(" ")) do
|
28
|
-
send("execute_#{MiniMagick.shell_api.
|
28
|
+
send("execute_#{MiniMagick.shell_api.tr("-", "_")}", command, options)
|
29
29
|
end
|
30
30
|
|
31
31
|
[stdout, stderr, status.exitstatus]
|
@@ -50,9 +50,7 @@ module MiniMagick
|
|
50
50
|
end
|
51
51
|
in_w.close
|
52
52
|
|
53
|
-
|
54
|
-
Timeout.timeout(MiniMagick.timeout) { thread.join }
|
55
|
-
rescue Timeout::Error
|
53
|
+
unless thread.join(MiniMagick.timeout)
|
56
54
|
Process.kill("TERM", thread.pid) rescue nil
|
57
55
|
Process.waitpid(thread.pid) rescue nil
|
58
56
|
raise Timeout::Error, "MiniMagick command timed out: #{command}"
|
data/lib/mini_magick/tool.rb
CHANGED
@@ -44,8 +44,10 @@ module MiniMagick
|
|
44
44
|
# @private
|
45
45
|
attr_reader :name, :args
|
46
46
|
|
47
|
-
# @param
|
48
|
-
#
|
47
|
+
# @param name [String]
|
48
|
+
# @param options [Hash]
|
49
|
+
# @option options [Boolean] :whiny Whether to raise errors on non-zero
|
50
|
+
# exit codes.
|
49
51
|
# @example
|
50
52
|
# MiniMagick::Tool::Identify.new(whiny: false) do |identify|
|
51
53
|
# identify.help # returns exit status 1, which would otherwise throw an error
|
@@ -190,9 +192,15 @@ module MiniMagick
|
|
190
192
|
# end
|
191
193
|
# # executes `convert wand.gif \( wizard.gif -rotate 30 \) +append images.gif`
|
192
194
|
#
|
193
|
-
def stack
|
195
|
+
def stack(*args)
|
194
196
|
self << "("
|
195
|
-
|
197
|
+
args.each do |value|
|
198
|
+
case value
|
199
|
+
when Hash then value.each { |key, value| send(key, *value) }
|
200
|
+
when String then self << value
|
201
|
+
end
|
202
|
+
end
|
203
|
+
yield self if block_given?
|
196
204
|
self << ")"
|
197
205
|
end
|
198
206
|
|
@@ -227,12 +235,13 @@ module MiniMagick
|
|
227
235
|
##
|
228
236
|
# Define creator operator methods
|
229
237
|
#
|
238
|
+
# @example
|
230
239
|
# mogrify = MiniMagick::Tool.new("mogrify")
|
231
240
|
# mogrify.canvas("khaki")
|
232
241
|
# mogrify.command.join(" ") #=> "mogrify canvas:khaki"
|
233
242
|
#
|
234
243
|
CREATION_OPERATORS.each do |operator|
|
235
|
-
define_method(operator.
|
244
|
+
define_method(operator.tr('-', '_')) do |value = nil|
|
236
245
|
self << "#{operator}:#{value}"
|
237
246
|
self
|
238
247
|
end
|
@@ -251,10 +260,11 @@ module MiniMagick
|
|
251
260
|
##
|
252
261
|
# Any undefined method will be transformed into a CLI option
|
253
262
|
#
|
263
|
+
# @example
|
254
264
|
# mogrify = MiniMagick::Tool.new("mogrify")
|
255
265
|
# mogrify.adaptive_blur("...")
|
256
266
|
# mogrify.foo_bar
|
257
|
-
# mogrify.command.join(" ") "mogrify -adaptive-blur ... -foo-bar"
|
267
|
+
# mogrify.command.join(" ") # => "mogrify -adaptive-blur ... -foo-bar"
|
258
268
|
#
|
259
269
|
def method_missing(name, *args)
|
260
270
|
option = "-#{name.to_s.tr('_', '-')}"
|
@@ -24,7 +24,7 @@ module MiniMagick
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def tempfile(extension)
|
27
|
-
Tempfile.new(["mini_magick", extension]).tap do |tempfile|
|
27
|
+
Tempfile.new(["mini_magick", extension], MiniMagick.tmpdir).tap do |tempfile|
|
28
28
|
tempfile.binmode
|
29
29
|
yield tempfile if block_given?
|
30
30
|
tempfile.close
|
data/lib/mini_magick/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_magick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Corey Johnson
|
@@ -10,10 +10,10 @@ authors:
|
|
10
10
|
- James Miller
|
11
11
|
- Thiago Fernandes Massa
|
12
12
|
- Janko Marohnić
|
13
|
-
autorequire:
|
13
|
+
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date:
|
16
|
+
date: 2022-12-07 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: rake
|
@@ -118,7 +118,6 @@ files:
|
|
118
118
|
- lib/mini_magick/configuration.rb
|
119
119
|
- lib/mini_magick/image.rb
|
120
120
|
- lib/mini_magick/image/info.rb
|
121
|
-
- lib/mini_magick/immutable_image.rb
|
122
121
|
- lib/mini_magick/shell.rb
|
123
122
|
- lib/mini_magick/tool.rb
|
124
123
|
- lib/mini_magick/tool/animate.rb
|
@@ -140,7 +139,7 @@ homepage: https://github.com/minimagick/minimagick
|
|
140
139
|
licenses:
|
141
140
|
- MIT
|
142
141
|
metadata: {}
|
143
|
-
post_install_message:
|
142
|
+
post_install_message:
|
144
143
|
rdoc_options: []
|
145
144
|
require_paths:
|
146
145
|
- lib
|
@@ -156,8 +155,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
156
155
|
version: '0'
|
157
156
|
requirements:
|
158
157
|
- You must have ImageMagick or GraphicsMagick installed
|
159
|
-
rubygems_version: 3.
|
160
|
-
signing_key:
|
158
|
+
rubygems_version: 3.3.3
|
159
|
+
signing_key:
|
161
160
|
specification_version: 4
|
162
161
|
summary: Manipulate images with minimal use of memory via ImageMagick / GraphicsMagick
|
163
162
|
test_files: []
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module MiniMagick
|
2
|
-
class Image
|
3
|
-
def initialize(source)
|
4
|
-
if source.is_a?(String) || source.is_a?(Pathname)
|
5
|
-
@source_path = source.to_s
|
6
|
-
elsif source.respond_to?(:path)
|
7
|
-
@source_path = source.path
|
8
|
-
else
|
9
|
-
fail ArgumentError, "invalid source object: #{source.inspect} (expected String, Pathname or #path)"
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def method_missing
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
image = MiniMagick::Image.new()
|