assembly-image 1.7.5 → 1.7.6
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 +4 -4
- data/lib/assembly-image/image.rb +29 -24
- data/lib/assembly-image/version.rb +1 -1
- data/spec/image_spec.rb +44 -26
- data/spec/spec_helper.rb +6 -2
- metadata +5 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e78a7843a4627deebdd77c16dc4da9664eba77fd78f6889b5f92bd95d36d29b5
|
4
|
+
data.tar.gz: 96d0a7a29dc79c80a6a3b87820ee9f7d21a93b78fe5b0fcca56a9a97a4dae505
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d992715e82f337b62d3008e54d3d864c4e8731786ced7889800719c0629bb4cd6c329d13581ad7af6ac6048b7a5eb1cf6891a55df71d37cb599750dddf15f9e
|
7
|
+
data.tar.gz: fbd72421b362ec757faec2e68fb92ebbdf71379475a933cf8179cbb0754d19f39a2d74bede1676d5d7217846febb98a2d5e676ded1576e0097f7196d330d6dcf
|
data/lib/assembly-image/image.rb
CHANGED
@@ -62,9 +62,9 @@ module Assembly
|
|
62
62
|
# Example:
|
63
63
|
# source_img=Assembly::ObjectFile.new('/input/path_to_file.tif')
|
64
64
|
# puts source_img.compressed? # gives true
|
65
|
-
def compressed?
|
66
|
-
|
67
|
-
end
|
65
|
+
# def compressed?
|
66
|
+
# exif.compression != 'Uncompressed'
|
67
|
+
# end
|
68
68
|
|
69
69
|
# Add an exif color profile descriptions to the image.
|
70
70
|
# This is useful if your source TIFFs do not have color profile descriptions in the EXIF data, but you know what it should be.
|
@@ -128,37 +128,29 @@ module Assembly
|
|
128
128
|
# derivative_img=source_img.create_jp2(:overwrite=>true)
|
129
129
|
# puts derivative_img.mimetype # 'image/jp2'
|
130
130
|
# puts derivative_image.path # '/input/path_to_file.jp2'
|
131
|
-
# rubocop:disable Metrics/AbcSize
|
132
|
-
# rubocop:disable Metrics/MethodLength
|
133
131
|
# rubocop:disable Metrics/CyclomaticComplexity:
|
134
132
|
def create_jp2(params = {})
|
135
133
|
output = params[:output] || jp2_filename
|
136
134
|
create_jp2_checks(output: output, overwrite: params[:overwrite])
|
137
135
|
|
138
136
|
# Using instance variable so that can check in tests.
|
139
|
-
|
140
|
-
@tmp_path = make_tmp_tiff(tmp_folder: params[:tmp_folder])
|
141
|
-
else
|
142
|
-
@path
|
143
|
-
end
|
137
|
+
@tmp_path = make_tmp_tiff(tmp_folder: params[:tmp_folder])
|
144
138
|
|
145
|
-
jp2_command = jp2_create_command(source_path:
|
139
|
+
jp2_command = jp2_create_command(source_path: @tmp_path, output: output)
|
146
140
|
result = `#{jp2_command}`
|
147
141
|
raise "JP2 creation command failed: #{jp2_command} with result #{result}" unless $CHILD_STATUS.success?
|
148
142
|
|
149
|
-
File.delete(
|
143
|
+
File.delete(@tmp_path) unless @tmp_path.nil? || params[:preserve_tmp_source]
|
150
144
|
|
151
145
|
# create output response object, which is an Assembly::Image type object
|
152
146
|
Assembly::Image.new(output)
|
153
147
|
end
|
154
|
-
# rubocop:enable Metrics/AbcSize
|
155
|
-
# rubocop:enable Metrics/MethodLength
|
156
148
|
|
157
149
|
private
|
158
150
|
|
159
|
-
def create_temp_tiff?
|
160
|
-
|
161
|
-
end
|
151
|
+
# def create_temp_tiff?
|
152
|
+
# mimetype != 'image/tiff' || compressed?
|
153
|
+
# end
|
162
154
|
|
163
155
|
def create_jp2_checks(output:, overwrite:)
|
164
156
|
check_for_file
|
@@ -204,6 +196,8 @@ module Assembly
|
|
204
196
|
case mimetype
|
205
197
|
when 'image/tiff'
|
206
198
|
1
|
199
|
+
when 'image/jpeg'
|
200
|
+
3
|
207
201
|
end
|
208
202
|
end
|
209
203
|
end
|
@@ -219,6 +213,16 @@ module Assembly
|
|
219
213
|
end
|
220
214
|
end
|
221
215
|
|
216
|
+
# Get size of image data in bytes
|
217
|
+
def image_data_size
|
218
|
+
(samples_per_pixel * height * width * bits_per_sample) / 8
|
219
|
+
end
|
220
|
+
|
221
|
+
# Bigtiff needs to be used if size of image exceeds 2^32 bytes.
|
222
|
+
def need_bigtiff?
|
223
|
+
image_data_size >= 2**32
|
224
|
+
end
|
225
|
+
|
222
226
|
# Get the number of JP2 layers to generate
|
223
227
|
def layers
|
224
228
|
pixdem = [width, height].max
|
@@ -278,17 +282,18 @@ module Assembly
|
|
278
282
|
when 3
|
279
283
|
options << '-type TrueColor'
|
280
284
|
when 1
|
281
|
-
|
282
|
-
|
283
|
-
options << '-depth 8' # force the production of a grayscale access derivative
|
284
|
-
elsif bits_per_sample > 1
|
285
|
-
options << '-type Grayscale'
|
286
|
-
end
|
285
|
+
options << '-depth 8' # force the production of a grayscale access derivative
|
286
|
+
options << '-type Grayscale'
|
287
287
|
end
|
288
288
|
|
289
289
|
options << profile_conversion_switch(profile, tmp_folder: tmp_folder)
|
290
290
|
|
291
|
-
|
291
|
+
# The output in the covnert command needs to be prefixed by the image type. By default ImageMagick
|
292
|
+
# will assume TIFF: when the file extension is .tif/.tiff. TIFF64: Needs to be forced when image will
|
293
|
+
# exceed 2^32 bytes in size
|
294
|
+
tiff_type = need_bigtiff? ? 'TIFF64:' : ''
|
295
|
+
|
296
|
+
tiff_command = "MAGICK_TEMPORARY_PATH=#{tmp_folder} convert -quiet -compress none #{options.join(' ')} '#{@path}[0]' #{tiff_type}'#{tmp_path}'"
|
292
297
|
result = `#{tiff_command} 2>&1`
|
293
298
|
raise "tiff convert command failed: #{tiff_command} with result #{result}" unless $CHILD_STATUS.success?
|
294
299
|
|
data/spec/image_spec.rb
CHANGED
@@ -29,14 +29,31 @@ describe Assembly::Image do
|
|
29
29
|
expect(@ai.dpg_jp2_filename).to eq '/path/to/a/file_with_no_05_extension.jp2'
|
30
30
|
end
|
31
31
|
|
32
|
-
it 'creates the jp2 without a temp file when given an uncompressed RGB tif' do
|
33
|
-
|
32
|
+
# it 'creates the jp2 without a temp file when given an uncompressed RGB tif' do
|
33
|
+
# generate_test_image(TEST_TIF_INPUT_FILE)
|
34
|
+
# expect(File).to exist TEST_TIF_INPUT_FILE
|
35
|
+
# expect(File).to_not exist TEST_JP2_OUTPUT_FILE
|
36
|
+
# @ai = Assembly::Image.new(TEST_TIF_INPUT_FILE)
|
37
|
+
# result = @ai.create_jp2(output: TEST_JP2_OUTPUT_FILE)
|
38
|
+
# # Indicates a temp tiff was not created.
|
39
|
+
# expect(@ai.tmp_path).to be_nil
|
40
|
+
# expect(result).to be_a_kind_of Assembly::Image
|
41
|
+
# expect(result.path).to eq TEST_JP2_OUTPUT_FILE
|
42
|
+
# expect(TEST_JP2_OUTPUT_FILE).to be_a_jp2
|
43
|
+
# expect(result.exif.colorspace).to eq 'sRGB'
|
44
|
+
# @jp2 = Assembly::Image.new(TEST_JP2_OUTPUT_FILE)
|
45
|
+
# expect(@jp2.height).to eq 100
|
46
|
+
# expect(@jp2.width).to eq 100
|
47
|
+
# end
|
48
|
+
|
49
|
+
it 'creates the jp2 with a temp file when given an LZW compressed RGB tif' do
|
50
|
+
generate_test_image(TEST_TIF_INPUT_FILE, compress: 'lzw')
|
34
51
|
expect(File).to exist TEST_TIF_INPUT_FILE
|
35
52
|
expect(File).to_not exist TEST_JP2_OUTPUT_FILE
|
36
53
|
@ai = Assembly::Image.new(TEST_TIF_INPUT_FILE)
|
37
54
|
result = @ai.create_jp2(output: TEST_JP2_OUTPUT_FILE)
|
38
55
|
# Indicates a temp tiff was not created.
|
39
|
-
expect(@ai.tmp_path).
|
56
|
+
expect(@ai.tmp_path).to_not be_nil
|
40
57
|
expect(result).to be_a_kind_of Assembly::Image
|
41
58
|
expect(result.path).to eq TEST_JP2_OUTPUT_FILE
|
42
59
|
expect(TEST_JP2_OUTPUT_FILE).to be_a_jp2
|
@@ -46,43 +63,47 @@ describe Assembly::Image do
|
|
46
63
|
expect(@jp2.width).to eq 100
|
47
64
|
end
|
48
65
|
|
49
|
-
it 'creates the jp2 with a temp file when given
|
50
|
-
|
66
|
+
it 'creates the jp2 with a temp file when given an uncompressed compressed RGB tif with more than 4GB of image data' do
|
67
|
+
skip 'This test will create a 4GB test image and a 4GB temporary image, so skipping by default.'
|
68
|
+
generate_test_image(TEST_TIF_INPUT_FILE, compress: 'none', width: '37838', height: '37838')
|
51
69
|
expect(File).to exist TEST_TIF_INPUT_FILE
|
52
70
|
expect(File).to_not exist TEST_JP2_OUTPUT_FILE
|
53
71
|
@ai = Assembly::Image.new(TEST_TIF_INPUT_FILE)
|
54
72
|
result = @ai.create_jp2(output: TEST_JP2_OUTPUT_FILE)
|
55
|
-
# Indicates a temp tiff was not created.
|
56
73
|
expect(@ai.tmp_path).to_not be_nil
|
57
74
|
expect(result).to be_a_kind_of Assembly::Image
|
58
75
|
expect(result.path).to eq TEST_JP2_OUTPUT_FILE
|
59
76
|
expect(TEST_JP2_OUTPUT_FILE).to be_a_jp2
|
60
77
|
expect(result.exif.colorspace).to eq 'sRGB'
|
61
78
|
@jp2 = Assembly::Image.new(TEST_JP2_OUTPUT_FILE)
|
62
|
-
expect(@jp2.height).to eq
|
63
|
-
expect(@jp2.width).to eq
|
79
|
+
expect(@jp2.height).to eq 37_838
|
80
|
+
expect(@jp2.width).to eq 37_838
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'creates the jp2 with a temp file when given an LZW compressed RGB tif with more than 4GB of image data' do
|
84
|
+
skip 'This test will create a 4GB temporary image, so skipping by default.'
|
85
|
+
generate_test_image(TEST_TIF_INPUT_FILE, compress: 'lzw', width: '37838', height: '37838')
|
86
|
+
expect(File).to exist TEST_TIF_INPUT_FILE
|
87
|
+
expect(File).to_not exist TEST_JP2_OUTPUT_FILE
|
88
|
+
@ai = Assembly::Image.new(TEST_TIF_INPUT_FILE)
|
89
|
+
result = @ai.create_jp2(output: TEST_JP2_OUTPUT_FILE)
|
90
|
+
expect(@ai.tmp_path).to_not be_nil
|
91
|
+
expect(result).to be_a_kind_of Assembly::Image
|
92
|
+
expect(result.path).to eq TEST_JP2_OUTPUT_FILE
|
93
|
+
expect(TEST_JP2_OUTPUT_FILE).to be_a_jp2
|
94
|
+
expect(result.exif.colorspace).to eq 'sRGB'
|
95
|
+
@jp2 = Assembly::Image.new(TEST_JP2_OUTPUT_FILE)
|
96
|
+
expect(@jp2.height).to eq 37_838
|
97
|
+
expect(@jp2.width).to eq 37_838
|
64
98
|
end
|
65
99
|
|
66
100
|
it 'creates grayscale jp2 when given a bitonal tif' do
|
67
|
-
|
68
|
-
|
69
|
-
# JP2 creation command failed: kdu_compress -precise -no_weights -quiet Creversible=no Cmodes=BYPASS
|
70
|
-
# Corder=RPCL Cblk=\{64,64\} Cprecincts=\{256,256\},\{256,256\},\{128,128\} ORGgen_plt=yes -rate 1.5 Clevels=5
|
71
|
-
# Clayers=2 -i '/tmp/408d3740-e25f-4c1b-889f-3f138d088fe4.tif' -o '/home/travis/build/sul-dlss/assembly-image/spec/test_data/output/test.jp2'
|
72
|
-
# with result Kakadu Error:
|
73
|
-
# The number of colours associated with the colour space identified by the source
|
74
|
-
# file (possible from an embedded ICC profile) is not consistent with the number
|
75
|
-
# of supplied image components and/or colour palette. You can address this
|
76
|
-
# problem by supplying a `-jp2_space' or `-jpx_space' argument to explicitly
|
77
|
-
# identify a colour space that has anywhere from 1 to 1 colour components.
|
78
|
-
generate_test_image(TEST_TIF_INPUT_FILE, image_type: 'Bilevel')
|
101
|
+
# Need to force group4 compression to get ImageMagick to create bitonal tiff
|
102
|
+
generate_test_image(TEST_TIF_INPUT_FILE, image_type: 'Bilevel', compress: 'group4')
|
79
103
|
expect(File).to exist TEST_TIF_INPUT_FILE
|
80
104
|
expect(File).to_not exist TEST_JP2_OUTPUT_FILE
|
81
105
|
@ai = Assembly::Image.new(TEST_TIF_INPUT_FILE)
|
82
|
-
expect(@ai).to have_color_profile
|
83
106
|
result = @ai.create_jp2(output: TEST_JP2_OUTPUT_FILE)
|
84
|
-
# Indicates a temp tiff was not created.
|
85
|
-
expect(@ai.tmp_path).to be_nil
|
86
107
|
expect(TEST_JP2_OUTPUT_FILE).to be_a_jp2
|
87
108
|
expect(result.exif.colorspace).to eq 'Grayscale'
|
88
109
|
end
|
@@ -94,8 +115,6 @@ describe Assembly::Image do
|
|
94
115
|
@ai = Assembly::Image.new(TEST_TIF_INPUT_FILE)
|
95
116
|
expect(@ai).to_not have_color_profile
|
96
117
|
result = @ai.create_jp2(output: TEST_JP2_OUTPUT_FILE)
|
97
|
-
# Indicates a temp tiff was not created.
|
98
|
-
expect(@ai.tmp_path).to be_nil
|
99
118
|
expect(TEST_JP2_OUTPUT_FILE).to be_a_jp2
|
100
119
|
expect(result.exif.colorspace).to eq 'sRGB'
|
101
120
|
end
|
@@ -232,7 +251,6 @@ describe Assembly::Image do
|
|
232
251
|
expect(result.path).to eq TEST_JP2_INPUT_FILE
|
233
252
|
expect(TEST_JP2_INPUT_FILE).to be_a_jp2
|
234
253
|
expect(result.exif.colorspace).to eq 'sRGB'
|
235
|
-
expect(@ai.tmp_path).to be_nil
|
236
254
|
end
|
237
255
|
|
238
256
|
it 'recreates jp2 if the output file exists and if you allow overwriting' do
|
data/spec/spec_helper.rb
CHANGED
@@ -16,22 +16,26 @@ TEST_DRUID = 'nx288wh8889'
|
|
16
16
|
# rubocop:disable Metrics/AbcSize
|
17
17
|
# rubocop:disable Metrics/CyclomaticComplexity
|
18
18
|
# rubocop:disable Metrics/MethodLength
|
19
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
19
20
|
def generate_test_image(file, params = {})
|
21
|
+
width = params[:width] || '100'
|
22
|
+
height = params[:height] || '100'
|
20
23
|
color = params[:color] || 'TrueColor'
|
21
24
|
profile = params[:profile] || 'sRGBIEC6196621'
|
22
25
|
image_type = params[:image_type]
|
23
|
-
create_command = "convert rose: -scale
|
26
|
+
create_command = "convert rose: -scale #{width}x#{height}\! -type #{color} "
|
24
27
|
create_command += ' -profile ' + File.join(Assembly::PATH_TO_IMAGE_GEM, 'profiles', profile + '.icc') + ' ' unless profile == ''
|
25
28
|
create_command += " -type #{image_type} " if image_type
|
26
29
|
create_command += ' -compress lzw ' if params[:compress]
|
27
30
|
create_command += file
|
28
31
|
create_command += ' 2>&1'
|
29
|
-
output = `#{
|
32
|
+
output = `#{create_command}`
|
30
33
|
raise "Failed to create test image #{file} (#{params}): \n#{output}" unless $CHILD_STATUS.success?
|
31
34
|
end
|
32
35
|
# rubocop:enable Metrics/AbcSize
|
33
36
|
# rubocop:enable Metrics/CyclomaticComplexity
|
34
37
|
# rubocop:enable Metrics/MethodLength
|
38
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
35
39
|
|
36
40
|
def remove_files(dir)
|
37
41
|
Dir.foreach(dir) do |f|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: assembly-image
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.7.
|
4
|
+
version: 1.7.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Mangiafico
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: exe
|
13
13
|
cert_chain: []
|
14
|
-
date: 2019-
|
14
|
+
date: 2019-08-13 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: assembly-objectfile
|
@@ -154,14 +154,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
154
154
|
- !ruby/object:Gem::Version
|
155
155
|
version: '0'
|
156
156
|
requirements: []
|
157
|
-
|
157
|
+
rubyforge_project: assembly-image
|
158
|
+
rubygems_version: 2.7.8
|
158
159
|
signing_key:
|
159
160
|
specification_version: 4
|
160
161
|
summary: Ruby immplementation of image services needed to prepare objects to be accessioned
|
161
162
|
in SULAIR digital library
|
162
|
-
test_files:
|
163
|
-
- spec/image_spec.rb
|
164
|
-
- spec/images_spec.rb
|
165
|
-
- spec/spec_helper.rb
|
166
|
-
- spec/test_data/input/.empty
|
167
|
-
- spec/test_data/output/.empty
|
163
|
+
test_files: []
|