mini_magick 4.6.1 → 4.7.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.

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