micro_magick 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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
-