micro_magick 0.0.2 → 0.0.3

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.
data/README.md CHANGED
@@ -24,15 +24,32 @@ source, performs operations on it, and saves the result to a different file.
24
24
 
25
25
  ```ruby
26
26
  img = MicroMagick::Convert.new("/path/to/image.jpg")
27
+ img.width
28
+ # => 3264
29
+ img.height
30
+ # => 2448
27
31
  img.strip
28
32
  img.quality(85)
29
33
  img.resize("640x480>")
30
- img.write("/different/path/image-640x480.jpg")
34
+ img.write("/new/path/image-640x480.jpg")
31
35
  ```
32
36
 
33
37
  This results in the following system call:
34
38
 
35
- ```gm convert -size 640x480 /path/to/image.jpg -strip -quality 85 -resize "640x480>" /different/path/image-640x480.jpg```
39
+ ```gm convert -size 640x480 /path/to/image.jpg +profile \* -quality 85 -resize "640x480>" /new/path/image-640x480.jpg```
40
+
41
+ ### "Plus" options
42
+
43
+ To add an output option that has a "plus" prefix, like, ```+matte```, use ```.add_output_option("+matte")```.
44
+
45
+ ### Goodies
46
+
47
+ There are a couple additional methods that have been added to address common image tasks:
48
+
49
+ * ```img.strip``` removes all comments and EXIF headers
50
+ * ```img.square_crop``` crops the image to a square (so a 640x480 image would crop down to a 480x480 image, cropped in the middle).
51
+
52
+
36
53
 
37
54
  Note that all of ```convert```'s options are supported, but ```micro_magick``` does no validations.
38
55
  A ```MicroMagick::ArgumentError``` will be raised on ```.write``` if
@@ -75,3 +92,7 @@ and run ```bundle```.
75
92
  ### 0.0.1
76
93
 
77
94
  Let's get this party started.
95
+
96
+ ### 0.0.3
97
+
98
+ Added square_crop, image dimensions, and support for ```+option```s.
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
3
 
4
- Rake::TestTask.new
4
+ test_task = Rake::TestTask.new
5
+ test_task.pattern = 'test/*test.rb'
6
+
5
7
  task :default => :test
data/lib/micro_magick.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "micro_magick/version"
2
2
  require "micro_magick/convert"
3
+ require "micro_magick/geometry"
3
4
  require "tempfile"
4
5
 
5
6
  module MicroMagick
@@ -3,41 +3,80 @@ require 'shellwords'
3
3
  module MicroMagick
4
4
  class Convert
5
5
  def initialize(input_file)
6
- @args = [Shellwords.escape(input_file)]
6
+ @input_file = input_file
7
+ @input_options = []
8
+ @output_options = []
7
9
  end
8
10
 
11
+ def width
12
+ geometry.width
13
+ end
14
+
15
+ def height
16
+ geometry.height
17
+ end
18
+
19
+ def geometry
20
+ @geometry ||= MicroMagick::Geometry.new(@input_file)
21
+ end
22
+
23
+ # strip the image of any profiles or comments
24
+ # (ImageMagick has the -strip command, but GraphicsMagick doesn't.
25
+ # It turns out that ```+profile *``` does the same thing.)
26
+ def strip
27
+ add_output_option("+profile", "*")
28
+ end
29
+
30
+ # Crop to a square, using the specified gravity.
31
+ def square_crop(gravity = "Center")
32
+ gravity(gravity) unless gravity.nil?
33
+ d = [width, height].min
34
+ crop("#{d}x#{d}+0+0!")
35
+ end
36
+
37
+ # For normal options, like -resize or -flip, you can call .resize("32x32") or .flip().
38
+ # If you need to add an output option that starts with a '+', you can use this method.
39
+ def add_output_option(option_name, *args)
40
+ (@output_options ||= []) << option_name
41
+ @output_options += args.collect { |ea| Shellwords.escape(ea.to_s) }
42
+
43
+ # if we're a resize call, let's give the -size render hint to gm, but only when it's safe:
44
+ # * we don't have input options yet,
45
+ # * we're not cropping (because the -size will prevent the crop from working),
46
+ # * and we have dimensions in the form of NNNxNNN
47
+ if %w{-geometry -resize -sample -scale}.include?(option_name) &&
48
+ @input_options.empty? &&
49
+ !@output_options.include?("-crop") &&
50
+ (dimensions = args.first) &&
51
+ (simple_dim = dimensions.scan(/(\d+x\d+)/).first)
52
+ @input_options << "-size #{simple_dim}"
53
+ end
54
+ end
55
+
56
+
57
+ # Executes `convert`, writing to output_file, and clearing all previously set input and output options.
58
+ # @return the command given to system()
9
59
  def write(output_file)
10
- @args << Shellwords.escape(output_file)
11
- cmd = build_command()
60
+ @output_file = output_file
61
+ cmd = command()
12
62
  MicroMagick.exec(cmd)
13
- @args = @args.first(1)
14
- @pre_input = nil
63
+ @input_options.clear
64
+ @output_options.clear
15
65
  cmd
16
66
  end
17
67
 
18
68
  protected
19
69
 
20
70
  def method_missing(method, *args, &block)
21
- if @pre_input.nil? && [:geometry, :resize, :sample, :scale].include?(method)
22
- dimensions = args.first
23
- # let's give the -size render hint to gm, but only if we're a resize call, and we have simple dimensions:
24
- if dimensions && (simple_dim = dimensions.scan(/(\d+x\d+)/).first)
25
- @pre_input = "-size #{simple_dim}"
26
- end
27
- end
28
-
29
- if method == :strip
30
- # ImageMagick knows that ```-strip```, means ```+profile "*"```
31
- @args << '+profile'
32
- @args << Shellwords.escape('*')
33
- else
34
- @args << "-#{method.to_s}"
35
- end
36
- @args += args.compact.collect { |ea| Shellwords.escape(ea.to_s) }
71
+ add_output_option("-#{method.to_s}", *args)
37
72
  end
38
73
 
39
- def build_command
40
- ([MicroMagick.cmd_prefix, "convert", @pre_input] + @args).compact.join(" ")
74
+ def command
75
+ ([MicroMagick.cmd_prefix, "convert"] +
76
+ @input_options +
77
+ [Shellwords.escape(@input_file)] +
78
+ @output_options +
79
+ [Shellwords.escape(@output_file)]).compact.join(" ")
41
80
  end
42
81
  end
43
82
  end
@@ -0,0 +1,22 @@
1
+ require 'shellwords'
2
+
3
+ module MicroMagick
4
+ class Geometry
5
+ attr_reader :width, :height
6
+
7
+ def initialize(input_file)
8
+ cmd = [MicroMagick.cmd_prefix,
9
+ "identify",
10
+ "-format",
11
+ "%w:%h",
12
+ Shellwords.escape(input_file)
13
+ ]
14
+ geometry = MicroMagick.exec(cmd.join(" "))
15
+ @width, @height = geometry.split(':').collect { |ea| ea.to_i }
16
+ end
17
+
18
+ def to_s
19
+ "#{width} x #{height}"
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module MicroMagick
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
File without changes
@@ -0,0 +1,9 @@
1
+ require "test/unit"
2
+
3
+ class GeometryTest < Test::Unit::TestCase
4
+ def test_geometry
5
+ img = MicroMagick::Convert.new("test/480x270.jpg")
6
+ assert_equal 270, img.width
7
+ assert_equal 480, img.height
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ require "test/micro_magick_test_base"
2
+
3
+ class MicroGmagickTest < MicroMagickTestBase
4
+
5
+ def setup
6
+ MicroMagick.use(:graphicsmagick)
7
+ super
8
+ end
9
+
10
+ end
11
+
@@ -0,0 +1,11 @@
1
+ require "test/micro_magick_test_base"
2
+
3
+ class MicroImagickTest < MicroMagickTestBase
4
+
5
+ def setup
6
+ MicroMagick.use(:imagemagick)
7
+ super
8
+ end
9
+
10
+ end
11
+
@@ -0,0 +1,33 @@
1
+ require "test/unit"
2
+
3
+ class MicroMagickTest < Test::Unit::TestCase
4
+
5
+ def test_use_nil
6
+ # This shouldn't throw:
7
+ MicroMagick.use(nil)
8
+
9
+ # eh, ok, now we should stub out system
10
+ # and verify that the next call to cmd_prefix
11
+ # calls `hash gm`?
12
+
13
+ # Meh, let's just assume that the test running machine has gm in their PATH.
14
+ assert_equal MicroMagick.cmd_prefix, "gm"
15
+ end
16
+
17
+ def test_use_invalid
18
+ assert_raise MicroMagick::InvalidArgument do
19
+ MicroMagick.use(:boink)
20
+ end
21
+ end
22
+
23
+ def test_use_gm
24
+ MicroMagick.use(:graphicsmagick)
25
+ assert_equal "gm", MicroMagick.cmd_prefix
26
+ end
27
+
28
+ def test_use_im
29
+ MicroMagick.use(:imagemagick)
30
+ assert_equal nil, MicroMagick.cmd_prefix
31
+ end
32
+
33
+ end
@@ -0,0 +1,66 @@
1
+ require "test/unit"
2
+ require "shellwords"
3
+ require "micro_magick"
4
+
5
+ class MicroMagickTestBase < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @img = MicroMagick::Convert.new("test/480x270.jpg")
9
+ tmp = Tempfile.new('out.jpg')
10
+ @outfile = tmp.path
11
+ tmp.close
12
+ tmp.delete
13
+ assert !File.exist?(@outfile)
14
+ end
15
+
16
+ def cmd_prefix
17
+ s = MicroMagick.cmd_prefix
18
+ s.nil? ? "" : s + " "
19
+ end
20
+
21
+ def test_resize
22
+ @img.resize("64x64")
23
+ command = @img.write(@outfile)
24
+ assert_equal "#{cmd_prefix}convert -size 64x64 test/480x270.jpg -resize 64x64 " + Shellwords.escape(@outfile), command
25
+ assert File.exist?(@outfile)
26
+ g = MicroMagick::Geometry.new(@outfile)
27
+ assert_equal (64 * (270.0/480.0)).to_i, g.width
28
+ assert_equal 64, g.height
29
+ end
30
+
31
+ def test_strip
32
+ @img.strip
33
+ command = @img.write(@outfile)
34
+ assert_equal "#{cmd_prefix}convert test/480x270.jpg +profile \\* " + Shellwords.escape(@outfile), command
35
+ end
36
+
37
+ def test_convert_with_crop
38
+ @img.quality(85)
39
+ @img.square_crop("North")
40
+ @img.resize("128x128")
41
+ command = @img.write(@outfile)
42
+ assert_equal "#{cmd_prefix}convert test/480x270.jpg " +
43
+ "-quality 85 -gravity North -crop 270x270\\+0\\+0\\! -resize 128x128 " +
44
+ Shellwords.escape(@outfile),
45
+ command
46
+ assert File.exist?(@outfile)
47
+ g = MicroMagick::Geometry.new(@outfile)
48
+ assert_equal 128, g.width
49
+ assert_equal 128, g.height
50
+
51
+ # make sure calling previous arguments don't leak into new calls:
52
+ @img.resize("64x64")
53
+ command = @img.write(@outfile)
54
+ assert_equal "#{cmd_prefix}convert -size 64x64 test/480x270.jpg -resize 64x64 " +
55
+ Shellwords.escape(@outfile),
56
+ command
57
+ end
58
+
59
+ def test_bad_args
60
+ @img.boing
61
+ assert_raise MicroMagick::InvalidArgument do
62
+ @img.write(@outfile)
63
+ end
64
+ end
65
+ end
66
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: micro_magick
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matthew McEachen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-03-01 00:00:00 Z
18
+ date: 2012-03-04 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  prerelease: false
@@ -47,10 +47,15 @@ files:
47
47
  - Rakefile
48
48
  - lib/micro_magick.rb
49
49
  - lib/micro_magick/convert.rb
50
+ - lib/micro_magick/geometry.rb
50
51
  - lib/micro_magick/version.rb
51
52
  - micro_magick.gemspec
52
- - test/640.jpg
53
- - test/test_micro_magick.rb
53
+ - test/480x270.jpg
54
+ - test/geometry_test.rb
55
+ - test/micro_gmagick_test.rb
56
+ - test/micro_imagick_test.rb
57
+ - test/micro_magick_test.rb
58
+ - test/micro_magick_test_base.rb
54
59
  homepage: ""
55
60
  licenses: []
56
61
 
@@ -85,5 +90,9 @@ signing_key:
85
90
  specification_version: 3
86
91
  summary: Simplest ImageMagick/GraphicsMagick ruby wrapper EVAR
87
92
  test_files:
88
- - test/640.jpg
89
- - test/test_micro_magick.rb
93
+ - test/480x270.jpg
94
+ - test/geometry_test.rb
95
+ - test/micro_gmagick_test.rb
96
+ - test/micro_imagick_test.rb
97
+ - test/micro_magick_test.rb
98
+ - test/micro_magick_test_base.rb
@@ -1,65 +0,0 @@
1
- require "test/unit"
2
- require "shellwords"
3
- require "micro_magick"
4
-
5
- class TestMicroMagick < Test::Unit::TestCase
6
-
7
- def test_use
8
- MicroMagick.use(:graphicsmagick)
9
- assert_equal MicroMagick.cmd_prefix, "gm"
10
- MicroMagick.use(:imagemagick)
11
- assert_equal MicroMagick.cmd_prefix, nil
12
-
13
- # This shouldn't throw:
14
- MicroMagick.use(nil)
15
- # eh, ok, now we should stub out system
16
- # and verify that the next call to cmd_prefix
17
- # calls `hash gm`?
18
-
19
- # Meh, let's just assume that the test running machine has gm in their PATH.
20
- assert_equal MicroMagick.cmd_prefix, "gm"
21
-
22
- assert_raise MicroMagick::InvalidArgument do
23
- MicroMagick.use(:boink)
24
- end
25
- end
26
-
27
- def test_convert
28
- i = MicroMagick::Convert.new("test/640.jpg")
29
- i.strip
30
- i.quality(85)
31
- i.gravity("Center")
32
- i.crop("250x250")
33
- i.resize("128x128")
34
- tmp = mktmpfile
35
- assert !File.exist?(tmp)
36
- command = i.write(tmp)
37
- assert_equal command, "gm convert -size 128x128 test/640.jpg +profile \\* " +
38
- "-quality 85 -gravity Center -crop 250x250 -resize 128x128 " +
39
- Shellwords.escape(tmp)
40
- assert File.exist?(tmp)
41
-
42
- # make sure calling previous arguments don't leak into new calls:
43
- i.resize("64x64")
44
- command = i.write(tmp)
45
- assert_equal command, "gm convert -size 64x64 test/640.jpg -resize 64x64 " +
46
- Shellwords.escape(tmp)
47
- end
48
-
49
- def mktmpfile
50
- tmp = Tempfile.new('out.jpg')
51
- outfile = tmp.path
52
- tmp.close
53
- tmp.delete
54
- outfile
55
- end
56
-
57
- def test_bad_args
58
- i = MicroMagick::Convert.new("test/640.jpg")
59
- i.boing
60
- assert_raise MicroMagick::InvalidArgument do
61
- i.write(mktmpfile)
62
- end
63
- end
64
- end
65
-