micro_magick 0.0.7 → 1.0.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 +5 -13
- data/lib/micro_magick.rb +41 -19
- data/lib/micro_magick/identify_parser.rb +4 -45
- data/lib/micro_magick/image.rb +4 -8
- data/lib/micro_magick/version.rb +1 -1
- data/test/393.JPG +0 -0
- data/test/bad_exif.jpg +0 -0
- data/test/{corrupt.jpg → borked.jpg} +0 -0
- data/test/image_tests.rb +28 -8
- data/test/micro_gmagick_test.rb +13 -1
- data/test/micro_imagick_test.rb +14 -1
- data/test/micro_magick_test.rb +2 -2
- data/test/test_helper.rb +5 -0
- metadata +21 -19
- data/test/identify_parser_test.rb +0 -185
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
Yzk2YzEyNTk2OTEzYzkyOWI1MGE4NTc3MGNiNmY0ZWI3OThiZDI0NA==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d5fe2a80cd4fd39386b5427a88450816586f236b
|
4
|
+
data.tar.gz: 8c1904a65e0e4cd5569e42d94ad725d6a234b2ed
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
YmJmZGI0ZTY1NTI3Y2U4NDdkN2M1YmY3YzdmMjUyNDgzN2YwYjcxMTE0OThj
|
11
|
-
MWJlNjFlZmUxYTIxMTgyZDQ4ZWVmOWQ3MGQ4YzI5YTg0ZWFkMmY=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NmI1ZmE4OTBlOTBlMGU4MjAxYzFmYjUzNTE2NGQ1OWE1NjEwMTRhYzAyNzUx
|
14
|
-
NmI3M2EwZDJmMzZmMjM1ZGMyODFkNjhlM2I0OTg1YjZmZjBmNTgxZTdjZDlm
|
15
|
-
NTI4ZWQzYWVhMGUwMjY0MzcyMTg2ZWJiOWViOTM0MjZmMTM2ZWI=
|
6
|
+
metadata.gz: f3ff709ef212a13c5286f47be04588b8746304b946d1594321aed5c23e7a46b9ceb460b475291fe50bc649e5a9f4c3aa19ab3d05d973a2f3707b133118ee8800
|
7
|
+
data.tar.gz: 4697bd37f648c0674a377e0df032763b742f226afe98aceb38a9da6a529222edacaff7ba9de0eed56673fe878b8feccccc16917d1148985dd8991d5de3b2396a
|
data/lib/micro_magick.rb
CHANGED
@@ -11,16 +11,40 @@ module MicroMagick
|
|
11
11
|
ArgumentError = Class.new(Error)
|
12
12
|
CorruptImageError = Class.new(Error)
|
13
13
|
|
14
|
-
def self.use_imagemagick
|
14
|
+
def self.use_imagemagick!
|
15
|
+
reset!
|
15
16
|
@cmd_prefix = ''
|
16
17
|
end
|
17
18
|
|
18
|
-
def self.use_graphicsmagick
|
19
|
+
def self.use_graphicsmagick!
|
20
|
+
reset!
|
19
21
|
@cmd_prefix = 'gm '
|
20
22
|
end
|
21
23
|
|
24
|
+
def self.graphicsmagick?
|
25
|
+
cmd_prefix == 'gm '
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.imagemagick?
|
29
|
+
!graphicsmagick?
|
30
|
+
end
|
31
|
+
|
22
32
|
def self.reset!
|
23
|
-
@cmd_prefix = nil
|
33
|
+
@cmd_prefix = @verbose_version = @version = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.verbose_version
|
37
|
+
@verbose_version ||= begin
|
38
|
+
cmd = graphicsmagick? ? %w(version) : %w(identify --version)
|
39
|
+
exec(cmd, true)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.version
|
44
|
+
@version ||= begin
|
45
|
+
m = verbose_version.split($/, 1).first.match(/([\d\.]{5,})/)
|
46
|
+
Gem::Version.new(m[1]) if m
|
47
|
+
end
|
24
48
|
end
|
25
49
|
|
26
50
|
def self.cmd_prefix
|
@@ -37,23 +61,21 @@ module MicroMagick
|
|
37
61
|
|
38
62
|
def self.exec(cmds, return_stdout = false)
|
39
63
|
final_cmd = cmd_prefix + cmds.join(' ')
|
40
|
-
stdout = Open3.
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
54
|
-
stdout.read.strip
|
64
|
+
stdout, stderr, status = Open3.capture3(final_cmd)
|
65
|
+
err = stderr.strip
|
66
|
+
if err.size > 0 || status != 0
|
67
|
+
error = if err =~ /unrecognized option/i
|
68
|
+
ArgumentError
|
69
|
+
elsif err =~ /corrupt/i
|
70
|
+
CorruptImageError
|
71
|
+
elsif err =~ /no such file or directory|unable to open/i
|
72
|
+
NoSuchFile
|
73
|
+
else
|
74
|
+
Error
|
75
|
+
end
|
76
|
+
raise error, "#{final_cmd} failed (#{status}): #{err}"
|
55
77
|
end
|
56
|
-
return_stdout ? stdout : final_cmd
|
78
|
+
return_stdout ? stdout.strip : final_cmd
|
57
79
|
rescue Errno::ENOENT => e
|
58
80
|
raise NoSuchFile, e.message
|
59
81
|
end
|
@@ -1,54 +1,13 @@
|
|
1
1
|
module MicroMagick
|
2
2
|
class IdentifyParser
|
3
3
|
|
4
|
-
|
4
|
+
DIMENSIONS_RE = /(\d+)x(\d+)/
|
5
5
|
|
6
|
+
attr_reader :width, :height
|
6
7
|
def initialize(stdout)
|
7
|
-
|
8
|
-
|
9
|
-
if @lines.empty?
|
10
|
-
@results = {}
|
11
|
-
else
|
12
|
-
@results = parse[:image] # < remove the "image" prefix.
|
13
|
-
if (m = /(\d+)x(\d+)/.match(@results[:geometry]))
|
14
|
-
@results[:width], @results[:height] = m[1].to_i, m[2].to_i
|
15
|
-
end
|
8
|
+
if (m = stdout.match(DIMENSIONS_RE))
|
9
|
+
@width, @height = m[1].to_i, m[2].to_i
|
16
10
|
end
|
17
11
|
end
|
18
|
-
|
19
|
-
def [](key)
|
20
|
-
results[key_to_sym(key)]
|
21
|
-
end
|
22
|
-
|
23
|
-
def parse
|
24
|
-
result = {}
|
25
|
-
while true
|
26
|
-
line = @lines.shift
|
27
|
-
key, value = split(line)
|
28
|
-
if @lines.first && indent(line) < indent(@lines.first)
|
29
|
-
# The current line has a sub-section.
|
30
|
-
result[key] = parse()
|
31
|
-
else
|
32
|
-
result[key] = value
|
33
|
-
end
|
34
|
-
|
35
|
-
# Next line is indented less than the current line:
|
36
|
-
break if @lines.first.nil? || indent(line) > indent(@lines.first)
|
37
|
-
end
|
38
|
-
result
|
39
|
-
end
|
40
|
-
|
41
|
-
def indent(line)
|
42
|
-
/\S/.match(line).begin(0)
|
43
|
-
end
|
44
|
-
|
45
|
-
def split(line)
|
46
|
-
k, v = line.split(':', 2).map(&:strip)
|
47
|
-
[key_to_sym(k), v]
|
48
|
-
end
|
49
|
-
|
50
|
-
def key_to_sym(key)
|
51
|
-
key.is_a?(Symbol) ? key : key.strip.gsub(/[\b\W_-]+/, '_').downcase.to_sym
|
52
|
-
end
|
53
12
|
end
|
54
13
|
end
|
data/lib/micro_magick/image.rb
CHANGED
@@ -11,16 +11,12 @@ module MicroMagick
|
|
11
11
|
@output_options = []
|
12
12
|
end
|
13
13
|
|
14
|
-
def [](key)
|
15
|
-
identify[key]
|
16
|
-
end
|
17
|
-
|
18
14
|
def width
|
19
|
-
|
15
|
+
identify.width unless corrupt?
|
20
16
|
end
|
21
17
|
|
22
18
|
def height
|
23
|
-
|
19
|
+
identify.height unless corrupt?
|
24
20
|
end
|
25
21
|
|
26
22
|
def corrupt?
|
@@ -100,8 +96,8 @@ module MicroMagick
|
|
100
96
|
|
101
97
|
def identify
|
102
98
|
@identify || begin
|
103
|
-
cmd = ['identify', '-verbose', Shellwords.escape(input_file)]
|
104
|
-
@identify = IdentifyParser.new(MicroMagick.exec(cmd, true))
|
99
|
+
cmd = ['identify', '-verbose', '-format', '%wx%h', Shellwords.escape(input_file)]
|
100
|
+
@identify = IdentifyParser.new(MicroMagick.exec(cmd, true))
|
105
101
|
@corrupt = false
|
106
102
|
rescue CorruptImageError => e
|
107
103
|
@identify = {}
|
data/lib/micro_magick/version.rb
CHANGED
data/test/393.JPG
ADDED
Binary file
|
data/test/bad_exif.jpg
ADDED
Binary file
|
File without changes
|
data/test/image_tests.rb
CHANGED
@@ -5,9 +5,10 @@ module ImageTests
|
|
5
5
|
def self.included spec_class
|
6
6
|
spec_class.class_eval do
|
7
7
|
|
8
|
-
let(:
|
8
|
+
let(:imgfile) { 'test/480x270.jpg' }
|
9
|
+
let(:img) { MicroMagick::Convert.new(imgfile) }
|
9
10
|
|
10
|
-
let(:corrupt) { MicroMagick::Convert.new('test/
|
11
|
+
let(:corrupt) { MicroMagick::Convert.new('test/borked.jpg') }
|
11
12
|
|
12
13
|
# By using the block format, the tempfile will be closed and deleted:
|
13
14
|
let(:outfile) { Tempfile.open(%w(out .jpg)) { |ea| ea.path } }
|
@@ -18,10 +19,24 @@ module ImageTests
|
|
18
19
|
img.corrupt?.must_be_false
|
19
20
|
end
|
20
21
|
|
22
|
+
def corrupt_checks_broken
|
23
|
+
MicroMagick.imagemagick? && MicroMagick.version < Gem::Version.new('6.7.0')
|
24
|
+
end
|
25
|
+
|
21
26
|
it 'detects corrupt images properly' do
|
22
|
-
|
23
|
-
|
24
|
-
|
27
|
+
if corrupt_checks_broken
|
28
|
+
puts "skipping .corrupt? tests"
|
29
|
+
else
|
30
|
+
corrupt.width.must_be_nil
|
31
|
+
corrupt.height.must_be_nil
|
32
|
+
corrupt.corrupt?.must_be_true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'extracts image geometry for problematic JPGs' do
|
37
|
+
jpg = MicroMagick::Image.new('test/bad_exif.jpg')
|
38
|
+
jpg.width.must_equal(1944)
|
39
|
+
jpg.height.must_equal(2592)
|
25
40
|
end
|
26
41
|
|
27
42
|
it 'resizes to cropped square' do
|
@@ -38,8 +53,13 @@ module ImageTests
|
|
38
53
|
img.strip
|
39
54
|
command = img.write(outfile)
|
40
55
|
command.must_equal "#{MicroMagick.cmd_prefix}convert test/480x270.jpg +profile \\* " + Shellwords.escape(outfile)
|
41
|
-
|
42
|
-
|
56
|
+
|
57
|
+
stripped = MicroMagick::Image.new(outfile)
|
58
|
+
stripped.corrupt?.must_be_false
|
59
|
+
stripped.width.must_equal img.width
|
60
|
+
stripped.height.must_equal img.height
|
61
|
+
|
62
|
+
File.stat(outfile).size.must_be :<, File.stat(imgfile).size
|
43
63
|
end
|
44
64
|
|
45
65
|
it 'crops properly' do
|
@@ -53,7 +73,7 @@ module ImageTests
|
|
53
73
|
g.height.must_equal 128
|
54
74
|
|
55
75
|
# make sure calling previous arguments don't leak into new calls:
|
56
|
-
img.resize(
|
76
|
+
img.resize('64x64')
|
57
77
|
command = img.write(outfile)
|
58
78
|
command.must_equal "#{MicroMagick.cmd_prefix}convert -size 64x64 test/480x270.jpg -resize 64x64 " +
|
59
79
|
Shellwords.escape(outfile)
|
data/test/micro_gmagick_test.rb
CHANGED
@@ -2,7 +2,19 @@ require 'test_helper'
|
|
2
2
|
require 'image_tests'
|
3
3
|
|
4
4
|
describe 'Image tests under GraphicsMagick' do
|
5
|
-
before { MicroMagick.use_graphicsmagick }
|
5
|
+
before { MicroMagick.use_graphicsmagick! }
|
6
|
+
|
7
|
+
it 'properly reports using graphicsmagick' do
|
8
|
+
MicroMagick.imagemagick?.must_equal false
|
9
|
+
MicroMagick.graphicsmagick?.must_equal true
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'returns the correct GraphicsMagick version' do
|
13
|
+
# GraphicsMagick should be around 1.3.x-ish. See http://www.graphicsmagick.org/Changelog.html
|
14
|
+
MicroMagick.version.must_be :<, Gem::Version.new('1.4')
|
15
|
+
MicroMagick.version.must_be :>, Gem::Version.new('1.0')
|
16
|
+
end
|
17
|
+
|
6
18
|
include ImageTests
|
7
19
|
end
|
8
20
|
|
data/test/micro_imagick_test.rb
CHANGED
@@ -2,7 +2,20 @@ require 'test_helper'
|
|
2
2
|
require 'image_tests'
|
3
3
|
|
4
4
|
describe 'Image tests under ImageMagick' do
|
5
|
-
before { MicroMagick.use_imagemagick }
|
5
|
+
before { MicroMagick.use_imagemagick! }
|
6
|
+
|
7
|
+
it 'properly reports using imagemagick' do
|
8
|
+
MicroMagick.imagemagick?.must_equal true
|
9
|
+
MicroMagick.graphicsmagick?.must_equal false
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'returns the correct ImageMagick version' do
|
13
|
+
# ImageMagick should be around 6.9.x-ish. See http://www.imagemagick.org/script/changelog.php
|
14
|
+
puts MicroMagick.version
|
15
|
+
MicroMagick.version.must_be :<, Gem::Version.new('7.0.0')
|
16
|
+
MicroMagick.version.must_be :>, Gem::Version.new('6.3.0')
|
17
|
+
end
|
18
|
+
|
6
19
|
include ImageTests
|
7
20
|
end
|
8
21
|
|
data/test/micro_magick_test.rb
CHANGED
@@ -9,12 +9,12 @@ describe MicroMagick do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it 'uses GraphicsMagick when set explicitly' do
|
12
|
-
MicroMagick.use_graphicsmagick
|
12
|
+
MicroMagick.use_graphicsmagick!
|
13
13
|
MicroMagick.cmd_prefix.must_equal 'gm '
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'uses ImageMagick when set explicitly' do
|
17
|
-
MicroMagick.use_imagemagick
|
17
|
+
MicroMagick.use_imagemagick!
|
18
18
|
MicroMagick.cmd_prefix.must_equal ''
|
19
19
|
end
|
20
20
|
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,83 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: micro_magick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew McEachen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: yard
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: minitest-great_expectations
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: minitest-reporters
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
description: ''
|
@@ -91,9 +91,10 @@ files:
|
|
91
91
|
- lib/micro_magick/identify_parser.rb
|
92
92
|
- lib/micro_magick/image.rb
|
93
93
|
- lib/micro_magick/version.rb
|
94
|
+
- test/393.JPG
|
94
95
|
- test/480x270.jpg
|
95
|
-
- test/
|
96
|
-
- test/
|
96
|
+
- test/bad_exif.jpg
|
97
|
+
- test/borked.jpg
|
97
98
|
- test/image_tests.rb
|
98
99
|
- test/micro_gmagick_test.rb
|
99
100
|
- test/micro_imagick_test.rb
|
@@ -108,24 +109,25 @@ require_paths:
|
|
108
109
|
- lib
|
109
110
|
required_ruby_version: !ruby/object:Gem::Requirement
|
110
111
|
requirements:
|
111
|
-
- -
|
112
|
+
- - ">="
|
112
113
|
- !ruby/object:Gem::Version
|
113
114
|
version: '0'
|
114
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
116
|
requirements:
|
116
|
-
- -
|
117
|
+
- - ">="
|
117
118
|
- !ruby/object:Gem::Version
|
118
119
|
version: '0'
|
119
120
|
requirements: []
|
120
121
|
rubyforge_project:
|
121
|
-
rubygems_version: 2.
|
122
|
+
rubygems_version: 2.4.5.1
|
122
123
|
signing_key:
|
123
124
|
specification_version: 4
|
124
125
|
summary: Simple and efficient ImageMagick/GraphicsMagick ruby wrapper
|
125
126
|
test_files:
|
127
|
+
- test/393.JPG
|
126
128
|
- test/480x270.jpg
|
127
|
-
- test/
|
128
|
-
- test/
|
129
|
+
- test/bad_exif.jpg
|
130
|
+
- test/borked.jpg
|
129
131
|
- test/image_tests.rb
|
130
132
|
- test/micro_gmagick_test.rb
|
131
133
|
- test/micro_imagick_test.rb
|
@@ -1,185 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
describe MicroMagick::IdentifyParser do
|
4
|
-
describe 'simple parsing functions' do
|
5
|
-
let(:ip) { MicroMagick::IdentifyParser.new('') }
|
6
|
-
it 'converts keys to expected symbols' do
|
7
|
-
ip.key_to_sym('Image').must_equal :image
|
8
|
-
ip.key_to_sym('Channel Depths').must_equal :channel_depths
|
9
|
-
ip.key_to_sym('JPEG-Quality').must_equal :jpeg_quality
|
10
|
-
ip.key_to_sym('Y Cb Cr Positioning').must_equal :y_cb_cr_positioning
|
11
|
-
ip.key_to_sym('Profile-EXIF').must_equal :profile_exif
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'determines line indent properly' do
|
15
|
-
ip.indent('Image: out.jpeg').must_equal 0
|
16
|
-
ip.indent(' Channel Depths:').must_equal 2
|
17
|
-
ip.indent(' Blue:').must_equal 4
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe 'with expected output' do
|
22
|
-
let(:ip) do
|
23
|
-
MicroMagick::IdentifyParser.new(<<-OUT)
|
24
|
-
Image: /tmp/input.jpg
|
25
|
-
Format: JPEG (Joint Photographic Experts Group JFIF format)
|
26
|
-
Mime type: image/jpeg
|
27
|
-
Class: DirectClass
|
28
|
-
Geometry: 1152x2048+0+0
|
29
|
-
Resolution: 72x72
|
30
|
-
Print size: 16x28.4444
|
31
|
-
Units: PixelsPerInch
|
32
|
-
Type: TrueColor
|
33
|
-
Endianess: Undefined
|
34
|
-
Colorspace: sRGB
|
35
|
-
Depth: 8-bit
|
36
|
-
Channel depth:
|
37
|
-
red: 8-bit
|
38
|
-
green: 8-bit
|
39
|
-
blue: 8-bit
|
40
|
-
Channel statistics:
|
41
|
-
Red:
|
42
|
-
min: 0 (0)
|
43
|
-
max: 255 (1)
|
44
|
-
mean: 133.986 (0.525437)
|
45
|
-
standard deviation: 54.1069 (0.212184)
|
46
|
-
kurtosis: -0.874804
|
47
|
-
skewness: -0.488666
|
48
|
-
Green:
|
49
|
-
min: 0 (0)
|
50
|
-
max: 255 (1)
|
51
|
-
mean: 119.681 (0.469337)
|
52
|
-
standard deviation: 64.5707 (0.253218)
|
53
|
-
kurtosis: -1.43104
|
54
|
-
skewness: -0.207503
|
55
|
-
Blue:
|
56
|
-
min: 0 (0)
|
57
|
-
max: 255 (1)
|
58
|
-
mean: 102.697 (0.402734)
|
59
|
-
standard deviation: 75.4283 (0.295797)
|
60
|
-
kurtosis: -1.69738
|
61
|
-
skewness: 0.0278036
|
62
|
-
Image statistics:
|
63
|
-
Overall:
|
64
|
-
min: 0 (0)
|
65
|
-
max: 255 (1)
|
66
|
-
mean: 118.788 (0.465836)
|
67
|
-
standard deviation: 65.2849 (0.256019)
|
68
|
-
kurtosis: -1.25648
|
69
|
-
skewness: -0.301872
|
70
|
-
Rendering intent: Perceptual
|
71
|
-
Gamma: 0.454545
|
72
|
-
Chromaticity:
|
73
|
-
red primary: (0.64,0.33)
|
74
|
-
green primary: (0.3,0.6)
|
75
|
-
blue primary: (0.15,0.06)
|
76
|
-
white point: (0.3127,0.329)
|
77
|
-
Background color: white
|
78
|
-
Border color: srgb(223,223,223)
|
79
|
-
Matte color: grey74
|
80
|
-
Transparent color: black
|
81
|
-
Interlace: None
|
82
|
-
Intensity: Undefined
|
83
|
-
Compose: Over
|
84
|
-
Page geometry: 1152x2048+0+0
|
85
|
-
Dispose: Undefined
|
86
|
-
Iterations: 0
|
87
|
-
Compression: JPEG
|
88
|
-
Quality: 94
|
89
|
-
Orientation: TopLeft
|
90
|
-
Properties:
|
91
|
-
date:create: 2014-02-09T08:59:26-08:00
|
92
|
-
date:modify: 2014-02-09T08:59:25-08:00
|
93
|
-
exif:ApertureValue: 228/100
|
94
|
-
exif:BrightnessValue: 105984/65536
|
95
|
-
exif:ColorSpace: 1
|
96
|
-
exif:ComponentsConfiguration: 1, 2, 3, 0
|
97
|
-
exif:Compression: 6
|
98
|
-
exif:DateTime: 2014:02:07 08:38:21
|
99
|
-
exif:DateTimeDigitized: 2014:02:07 08:38:21
|
100
|
-
exif:DateTimeOriginal: 2014:02:07 08:38:21
|
101
|
-
exif:ExifImageLength: 2048
|
102
|
-
exif:ExifImageWidth: 1152
|
103
|
-
exif:ExifOffset: 230
|
104
|
-
exif:ExifVersion: 48, 50, 50, 48
|
105
|
-
exif:ExposureBiasValue: 0/10
|
106
|
-
exif:ExposureMode: 0
|
107
|
-
exif:ExposureProgram: 2
|
108
|
-
exif:ExposureTime: 1/25
|
109
|
-
exif:Flash: 0
|
110
|
-
exif:FlashPixVersion: 48, 49, 48, 48
|
111
|
-
exif:FNumber: 220/100
|
112
|
-
exif:FocalLength: 420/100
|
113
|
-
exif:FocalLengthIn35mmFilm: 31
|
114
|
-
exif:GPSAltitude: 0/1000
|
115
|
-
exif:GPSAltitudeRef: 0
|
116
|
-
exif:GPSDateStamp: 2014:02:07
|
117
|
-
exif:GPSInfo: 722
|
118
|
-
exif:GPSLatitude: 37/1, 46/1, 341802/10000
|
119
|
-
exif:GPSLatitudeRef: N
|
120
|
-
exif:GPSLongitude: 122/1, 25/1, 6225/10000
|
121
|
-
exif:GPSLongitudeRef: W
|
122
|
-
exif:GPSProcessingMethod: ASCII
|
123
|
-
exif:GPSTimeStamp: 16/1, 38/1, 11/1
|
124
|
-
exif:GPSVersionID: 2, 2, 0, 0
|
125
|
-
exif:ImageLength: 1152
|
126
|
-
exif:ImageUniqueID: 9e6076155a3bd1ce0000000000000000
|
127
|
-
exif:ImageWidth: 2048
|
128
|
-
exif:InteroperabilityIndex: R98
|
129
|
-
exif:InteroperabilityOffset: 948
|
130
|
-
exif:InteroperabilityVersion: 48, 49, 48, 48
|
131
|
-
exif:ISOSpeedRatings: 125
|
132
|
-
exif:JPEGInterchangeFormat: 1072
|
133
|
-
exif:JPEGInterchangeFormatLength: 4729
|
134
|
-
exif:LightSource: 0
|
135
|
-
exif:Make: SAMSUNG
|
136
|
-
exif:MaxApertureValue: 228/100
|
137
|
-
exif:MeteringMode: 1
|
138
|
-
exif:Model: SCH-I545
|
139
|
-
exif:Orientation: 1
|
140
|
-
exif:ResolutionUnit: 2
|
141
|
-
exif:SceneCaptureType: 0
|
142
|
-
exif:SceneType: 1
|
143
|
-
exif:SensingMethod: 2
|
144
|
-
exif:ShutterSpeedValue: 304394/65536
|
145
|
-
exif:Software: Google
|
146
|
-
exif:thumbnail:ResolutionUnit: 2
|
147
|
-
exif:thumbnail:XResolution: 72/1
|
148
|
-
exif:thumbnail:YResolution: 72/1
|
149
|
-
exif:WhiteBalance: 0
|
150
|
-
exif:XResolution: 72/1
|
151
|
-
exif:YCbCrPositioning: 1
|
152
|
-
exif:YResolution: 72/1
|
153
|
-
jpeg:colorspace: 2
|
154
|
-
jpeg:sampling-factor: 2x2,1x1,1x1
|
155
|
-
signature: 2e969ff76481f84c85031e191ee902825bf6c2a12fb6083da57633326cde2bef
|
156
|
-
Profiles:
|
157
|
-
Profile-exif: 5808 bytes
|
158
|
-
Profile-xmp: 325 bytes
|
159
|
-
Artifacts:
|
160
|
-
filename: /Users/mrm/Downloads/20140207_083822.jpg
|
161
|
-
verbose: true
|
162
|
-
Tainted: False
|
163
|
-
Filesize: 227KB
|
164
|
-
Number pixels: 2.359M
|
165
|
-
Pixels per second: 29.49MB
|
166
|
-
User time: 0.070u
|
167
|
-
Elapsed time: 0:01.080
|
168
|
-
Version: ImageMagick 6.8.7-7 Q16 x86_64 2013-11-27 http://www.imagemagick.org
|
169
|
-
OUT
|
170
|
-
end
|
171
|
-
|
172
|
-
it 'extracts width and depth from geometry' do
|
173
|
-
ip[:width].must_equal 1152
|
174
|
-
ip[:height].must_equal 2048
|
175
|
-
end
|
176
|
-
|
177
|
-
it 'extracts sub-sections properly' do
|
178
|
-
ip[:channel_depth][:red].must_equal '8-bit'
|
179
|
-
ip[:channel_depth][:green].must_equal '8-bit'
|
180
|
-
ip[:channel_depth][:blue].must_equal '8-bit'
|
181
|
-
ip[:artifacts][:verbose].must_equal 'true'
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
end
|