mini_magick 4.6.1 → 4.7.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b4a0a556ff59b381d54bd9baeef89aa7ccaab8e5
4
- data.tar.gz: 11a3549176fa09ed8afc3751cbd64d1b2a3aceb8
3
+ metadata.gz: 05cb25170ed225d7cf9cd284fb2ab22c3f420c1e
4
+ data.tar.gz: cf813a1f5be6b785e3480c75f24af283d30ac5df
5
5
  SHA512:
6
- metadata.gz: 3d55ad85c6fefd00cbe9cceabaa158eafb096384309e5baaf7133df542d6ff5273f8e17bed5ec7c5163ebe5fa110635835cb52fc453d045158164f734581aa5a
7
- data.tar.gz: 9c50eeddd1c9e4393522754679f4b2ba4db953a375568c2c26dab4c9958a56b89feb404d930a2ce30fd37fdd82d88ec85256f3c5df9553964524ceea474a3948
6
+ metadata.gz: 9cf14a742ba8854518d7e5b3b825161ab740244f8d94ce07ce71e5b1793747ba3d650923758eeec2d8ec38bdebc2155c72d5c136ce6475ade7f9fbfe3679130d
7
+ data.tar.gz: 0141e84fce516b37c6ca2191875fdb28c5c942cad1033d5bf8ce03ed69acca9c26208148639b39ca964139d7f3c2c634d94e10af55316270e669dba39630f08f
@@ -316,6 +316,47 @@ module MiniMagick
316
316
  alias pages layers
317
317
  alias frames layers
318
318
 
319
+ ##
320
+ # Returns a matrix of pixels from the image. The matrix is constructed as
321
+ # an array (1) of arrays (2) of arrays (3) of unsigned integers:
322
+ #
323
+ # 1) one for each row of pixels
324
+ # 2) one for each column of pixels
325
+ # 3) three elements in the range 0-255, one for each of the RGB color channels
326
+ #
327
+ # @example
328
+ # img = MiniMagick::Image.open 'image.jpg'
329
+ # pixels = img.get_pixels
330
+ # pixels[3][2][1] # the green channel value from the 4th-row, 3rd-column pixel
331
+ #
332
+ # It can also be called after applying transformations:
333
+ #
334
+ # @example
335
+ # img = MiniMagick::Image.open 'image.jpg'
336
+ # img.crop '20x30+10+5'
337
+ # img.colorspace 'Gray'
338
+ # pixels = img.get_pixels
339
+ #
340
+ # In this example, all pixels in pix should now have equal R, G, and B values.
341
+ #
342
+ # @return [Array] Matrix of each color of each pixel
343
+ def get_pixels
344
+ output = MiniMagick::Tool::Convert.new do |convert|
345
+ convert << path
346
+ convert.depth(8)
347
+ convert << "RGB:-"
348
+ end
349
+
350
+ pixels_array = output.unpack("C*")
351
+ pixels = pixels_array.each_slice(3).each_slice(width).to_a
352
+
353
+ # deallocate large intermediary objects
354
+ output.clear
355
+ pixels_array.clear
356
+
357
+ pixels
358
+ end
359
+
319
360
  ##
320
361
  # This is used to change the format of the image. That is, from "tiff to
321
362
  # jpg" or something like that. Once you run it, the instance is pointing to
@@ -531,6 +572,5 @@ module MiniMagick
531
572
  def layer?
532
573
  path =~ /\[\d+\]$/
533
574
  end
534
-
535
575
  end
536
576
  end
@@ -13,12 +13,9 @@ module MiniMagick
13
13
  def run(command, options = {})
14
14
  stdout, stderr, status = execute(command, stdin: options[:stdin])
15
15
 
16
- case status
17
- when 1
16
+ if status != 0 && options.fetch(:whiny, MiniMagick.whiny)
18
17
  fail MiniMagick::Error, "`#{command.join(" ")}` failed with error:\n#{stderr}"
19
- when 127
20
- fail MiniMagick::Error, stderr
21
- end if options.fetch(:whiny, MiniMagick.whiny)
18
+ end
22
19
 
23
20
  $stderr.print(stderr) unless options[:stderr] == false
24
21
 
@@ -28,9 +25,7 @@ module MiniMagick
28
25
  def execute(command, options = {})
29
26
  stdout, stderr, status =
30
27
  log(command.join(" ")) do
31
- Timeout.timeout(MiniMagick.timeout) do
32
- send("execute_#{MiniMagick.shell_api.gsub("-", "_")}", command, options)
33
- end
28
+ send("execute_#{MiniMagick.shell_api.gsub("-", "_")}", command, options)
34
29
  end
35
30
 
36
31
  [stdout, stderr, status.exitstatus]
@@ -43,20 +38,38 @@ module MiniMagick
43
38
  def execute_open3(command, options = {})
44
39
  require "open3"
45
40
 
46
- Open3.capture3(*command, binmode: true, stdin_data: options[:stdin].to_s)
41
+ in_w, out_r, err_r, subprocess_thread = Open3.popen3(*command)
42
+
43
+ capture_command(in_w, out_r, err_r, subprocess_thread, options)
47
44
  end
48
45
 
49
46
  def execute_posix_spawn(command, options = {})
50
47
  require "posix-spawn"
51
48
 
52
- pid, stdin, stdout, stderr = POSIX::Spawn.popen4(*command)
53
- [stdin, stdout, stderr].each(&:binmode)
54
- stdin.write(options[:stdin].to_s)
55
- out = stdout.read
56
- err = stderr.read
57
- Process.waitpid(pid)
49
+ pid, in_w, out_r, err_r = POSIX::Spawn.popen4(*command)
50
+ subprocess_thread = Process.detach(pid)
51
+
52
+ capture_command(in_w, out_r, err_r, subprocess_thread, options)
53
+ end
54
+
55
+ def capture_command(in_w, out_r, err_r, subprocess_thread, options)
56
+ [in_w, out_r, err_r].each(&:binmode)
57
+ stdout_reader = Thread.new { out_r.read }
58
+ stderr_reader = Thread.new { err_r.read }
59
+ begin
60
+ in_w.write options[:stdin].to_s
61
+ rescue Errno::EPIPE
62
+ end
63
+ in_w.close
64
+
65
+ Timeout.timeout(MiniMagick.timeout) { subprocess_thread.join }
58
66
 
59
- [out, err, $?]
67
+ [stdout_reader.value, stderr_reader.value, subprocess_thread.value]
68
+ rescue Timeout::Error => error
69
+ Process.kill("TERM", subprocess_thread.pid)
70
+ raise error
71
+ ensure
72
+ [out_r, err_r].each(&:close)
60
73
  end
61
74
 
62
75
  def log(command, &block)
@@ -8,8 +8,8 @@ module MiniMagick
8
8
 
9
9
  module VERSION
10
10
  MAJOR = 4
11
- MINOR = 6
12
- TINY = 1
11
+ MINOR = 7
12
+ TINY = 0
13
13
  PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
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.6.1
4
+ version: 4.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Corey Johnson
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2017-02-12 00:00:00.000000000 Z
16
+ date: 2017-03-28 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: rake
@@ -43,6 +43,34 @@ dependencies:
43
43
  - - "~>"
44
44
  - !ruby/object:Gem::Version
45
45
  version: 3.5.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: guard
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ type: :development
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ - !ruby/object:Gem::Dependency
61
+ name: guard-rspec
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
46
74
  - !ruby/object:Gem::Dependency
47
75
  name: posix-spawn
48
76
  requirement: !ruby/object:Gem::Requirement