exifr 0.10.3 → 0.10.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +3 -0
- data/Rakefile +14 -1
- data/lib/jpeg.rb +5 -0
- data/lib/tiff.rb +11 -0
- data/tests/test_helper.rb +11 -1
- data/tests/test_jpeg.rb +15 -0
- data/tests/test_tiff.rb +18 -2
- metadata +2 -2
data/CHANGELOG
CHANGED
data/Rakefile
CHANGED
@@ -6,9 +6,22 @@ require 'rake/testtask'
|
|
6
6
|
|
7
7
|
task :default => :test
|
8
8
|
|
9
|
+
desc 'Generate site'
|
10
|
+
task :site => :rdoc do
|
11
|
+
system 'rsync -av --delete doc/ remvee@rubyforge.org:/var/www/gforge-projects/exifr'
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Tag current trunk. Use VERSION to provide a version spec."
|
15
|
+
task :tag do
|
16
|
+
version = ENV['VERSION'] or raise 'provide VERSION'
|
17
|
+
base = 'svn+ssh://remvee@rubyforge.org/var/svn/exifr'
|
18
|
+
trunk, tag = base + "/trunk", base + "/tags/#{version}"
|
19
|
+
system *(%w(svn copy -m) << "tagged release #{version}" << trunk << tag)
|
20
|
+
end
|
21
|
+
|
9
22
|
spec = Gem::Specification.new do |s|
|
10
23
|
s.name = 'exifr'
|
11
|
-
s.version = '0.10.
|
24
|
+
s.version = '0.10.4'
|
12
25
|
s.author = "R.W. van 't Veer"
|
13
26
|
s.email = 'remco@remvee.net'
|
14
27
|
s.homepage = 'http://exifr.rubyforge.org/'
|
data/lib/jpeg.rb
CHANGED
@@ -34,6 +34,11 @@ module EXIFR
|
|
34
34
|
def exif?
|
35
35
|
!exif.nil?
|
36
36
|
end
|
37
|
+
|
38
|
+
# Return thumbnail data when available.
|
39
|
+
def thumbnail
|
40
|
+
@exif && @exif.jpeg_thumbnails && @exif.jpeg_thumbnails.first
|
41
|
+
end
|
37
42
|
|
38
43
|
# Dispatch to EXIF. When no EXIF data is available but the +method+ does exist
|
39
44
|
# for EXIF data +nil+ will be returned.
|
data/lib/tiff.rb
CHANGED
@@ -37,6 +37,9 @@ module EXIFR
|
|
37
37
|
class TIFF
|
38
38
|
include Enumerable
|
39
39
|
|
40
|
+
# JPEG thumbnails
|
41
|
+
attr_reader :jpeg_thumbnails
|
42
|
+
|
40
43
|
TAG_MAPPING = {} # :nodoc:
|
41
44
|
TAG_MAPPING.merge!({
|
42
45
|
:image => {
|
@@ -317,6 +320,13 @@ module EXIFR
|
|
317
320
|
|
318
321
|
@ifds = [IFD.new(data)]
|
319
322
|
while ifd = @ifds.last.next; @ifds << ifd; end
|
323
|
+
|
324
|
+
@jpeg_thumbnails = @ifds.map do |ifd|
|
325
|
+
if ifd.jpeg_interchange_format && ifd.jpeg_interchange_format_length
|
326
|
+
start, length = ifd.jpeg_interchange_format, ifd.jpeg_interchange_format_length
|
327
|
+
data[start..(start + length)]
|
328
|
+
end
|
329
|
+
end.compact
|
320
330
|
end
|
321
331
|
|
322
332
|
# Number of images.
|
@@ -413,6 +423,7 @@ module EXIFR
|
|
413
423
|
private
|
414
424
|
def add_field(field)
|
415
425
|
return unless tag = TAG_MAPPING[@type][field.tag]
|
426
|
+
|
416
427
|
if IFD_TAGS.include? tag
|
417
428
|
@fields[tag] = IFD.new(@data, field.offset, tag)
|
418
429
|
else
|
data/tests/test_helper.rb
CHANGED
@@ -21,9 +21,19 @@ def all_test_exifs
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def all_test_tiffs
|
24
|
-
Dir[f('*.tif')]
|
24
|
+
Dir[f('*.tif')] + all_test_exifs
|
25
25
|
end
|
26
26
|
|
27
27
|
def f(fname)
|
28
28
|
"#{File.dirname(__FILE__)}/data/#{fname}"
|
29
29
|
end
|
30
|
+
|
31
|
+
def assert_literally_equal(expected, actual, *args)
|
32
|
+
assert_equal expected.to_s, actual.to_s, *args
|
33
|
+
end
|
34
|
+
|
35
|
+
class Hash
|
36
|
+
def to_s
|
37
|
+
keys.map{|k| k.to_s}.sort.map{|k| "#{k.inspect} => #{self[k].inspect}" }.join(', ')
|
38
|
+
end
|
39
|
+
end
|
data/tests/test_jpeg.rb
CHANGED
@@ -60,4 +60,19 @@ class TestJPEG < Test::Unit::TestCase
|
|
60
60
|
def test_multiple_app1
|
61
61
|
assert JPEG.new(f('multiple-app1.jpg')).exif?
|
62
62
|
end
|
63
|
+
|
64
|
+
def test_thumbnail
|
65
|
+
count = 0
|
66
|
+
all_test_jpegs.each do |fname|
|
67
|
+
jpeg = JPEG.new(fname)
|
68
|
+
unless jpeg.thumbnail.nil?
|
69
|
+
assert_nothing_raised 'thumbnail not a JPEG' do
|
70
|
+
JPEG.new(StringIO.new(jpeg.thumbnail))
|
71
|
+
end
|
72
|
+
count += 1
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
assert count > 0, 'no thumbnails found'
|
77
|
+
end
|
63
78
|
end
|
data/tests/test_tiff.rb
CHANGED
@@ -116,7 +116,7 @@ class TestTIFF < Test::Unit::TestCase
|
|
116
116
|
all_test_tiffs.each do |fname|
|
117
117
|
t = TIFF.new(fname)
|
118
118
|
TIFF::TAGS.each do |key|
|
119
|
-
|
119
|
+
assert_literally_equal t.send(key), t.to_hash[key], "#{key} not equal"
|
120
120
|
end
|
121
121
|
end
|
122
122
|
end
|
@@ -133,7 +133,23 @@ class TestTIFF < Test::Unit::TestCase
|
|
133
133
|
all_test_tiffs.each do |fname|
|
134
134
|
t = TIFF.new(fname)
|
135
135
|
y = YAML.dump(t)
|
136
|
-
|
136
|
+
assert_literally_equal t.to_hash, YAML.load(y).to_hash
|
137
137
|
end
|
138
138
|
end
|
139
|
+
|
140
|
+
def test_jpeg_thumbnails
|
141
|
+
count = 0
|
142
|
+
all_test_tiffs.each do |fname|
|
143
|
+
t = TIFF.new(fname)
|
144
|
+
unless t.jpeg_thumbnails.empty?
|
145
|
+
assert_nothing_raised do
|
146
|
+
t.jpeg_thumbnails.each do |n|
|
147
|
+
JPEG.new(StringIO.new(n))
|
148
|
+
end
|
149
|
+
end
|
150
|
+
count += 1
|
151
|
+
end
|
152
|
+
end
|
153
|
+
assert count > 0, 'no thumbnails found'
|
154
|
+
end
|
139
155
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: exifr
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.10.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.10.4
|
7
|
+
date: 2007-11-04 00:00:00 +01:00
|
8
8
|
summary: EXIF Reader is a module to read EXIF from JPEG images.
|
9
9
|
require_paths:
|
10
10
|
- lib
|