assembly-image 2.0.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,149 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'ruby-vips'
4
- require 'assembly-objectfile'
5
- require_relative 'jp2_creator'
6
-
7
- module Assembly
8
- # The Image class contains methods to operate on an image.
9
- class Image < Assembly::ObjectFile
10
- # Examines the input image for validity. Used to determine if image is correct and if JP2 generation is likely to succeed.
11
- # This method is automatically called before you create a jp2 but it can be called separately earlier as a sanity check.
12
- #
13
- # @return [boolean] true if image is valid, false if not.
14
- #
15
- # Example:
16
- # source_img=Assembly::ObjectFile.new('/input/path_to_file.tif')
17
- # puts source_img.valid? # gives true
18
- def valid?
19
- valid_image? # behavior is defined in assembly-objectfile gem
20
- end
21
-
22
- # Get the image color profile
23
- #
24
- # @return [string] image color profile
25
- # Example:
26
- # source_img=Assembly::Image.new('/input/path_to_file.tif')
27
- # puts source_img.profile # gives 'Adobe RGB 1998'
28
- def profile
29
- exif.nil? ? nil : exif['profiledescription']
30
- end
31
-
32
- # Get the image height from exif data
33
- #
34
- # @return [integer] image height in pixels
35
- # Example:
36
- # source_img=Assembly::Image.new('/input/path_to_file.tif')
37
- # puts source_img.height # gives 100
38
- def height
39
- exif.imageheight
40
- end
41
-
42
- # Get the image width from exif data
43
- # @return [integer] image height in pixels
44
- # Example:
45
- # source_img=Assembly::Image.new('/input/path_to_file.tif')
46
- # puts source_img.width # gives 100
47
- def width
48
- exif.imagewidth
49
- end
50
-
51
- # Examines the input image to determine if it is compressed.
52
- #
53
- # @return [boolean] true if image is compressed, false if not.
54
- #
55
- # Example:
56
- # source_img=Assembly::ObjectFile.new('/input/path_to_file.tif')
57
- # puts source_img.compressed? # gives true
58
- # def compressed?
59
- # exif.compression != 'Uncompressed'
60
- # end
61
-
62
- # Add an exif color profile descriptions to the image.
63
- # This is useful if your source TIFFs do not have color profile descriptions in the EXIF data, but you know what it should be.
64
- # This will allow the images to pass the validaty check and have JP2s created successfully.
65
- #
66
- # Note you will need full read/write access to the source path so that new EXIF data can be saved.
67
- #
68
- # @param [String] profile_name profile name to be added, current options are 'Adobe RBG 1998','Dot Gain 20%','sRGB IEC61966-2.1'
69
- #
70
- # @param [String] force if set to true, force overwrite a color profile description even if it already exists (default: false)
71
- #
72
- # Example:
73
- # source_img=Assembly::Image.new('/input/path_to_file.tif')
74
- # source_img.add_exif_profile_description('Adobe RGB 1998')
75
- def add_exif_profile_description(profile_name, force = false)
76
- if profile.nil? || force
77
- input_profile = profile_name.gsub(/[^[:alnum:]]/, '') # remove all non alpha-numeric characters, so we can get to a filename
78
- input_profile_file = File.join(PATH_TO_PROFILES, "#{input_profile}.icc")
79
- command = "exiftool '-icc_profile<=#{input_profile_file}' #{path}"
80
- result = `#{command} 2>&1`
81
- raise "profile addition command failed: #{command} with result #{result}" unless $CHILD_STATUS.success?
82
- end
83
- rescue StandardError => e
84
- puts "** Error for #{filename}: #{e.message}"
85
- end
86
-
87
- # Returns the full default jp2 path and filename that will be created from the given image
88
- #
89
- # @return [string] full default jp2 path and filename that will be created from the given image
90
- # Example:
91
- # source_img=Assembly::Image.new('/input/path_to_file.tif')
92
- # puts source_img.jp2_filename # gives /input/path_to_file.jp2
93
- def jp2_filename
94
- File.extname(path).empty? ? "#{path}.jp2" : path.gsub(File.extname(path), '.jp2')
95
- end
96
-
97
- # Create a JP2 file for the current image.
98
- # Important note: this will not work for multipage TIFFs.
99
- #
100
- # @return [Assembly::Image] object containing the generated JP2 file
101
- #
102
- # @param [Hash] params Optional parameters specified as a hash, using symbols for options:
103
- # * :output => path to the output JP2 file (default: mirrors the source file name and path, but with a .jp2 extension)
104
- # * :overwrite => if set to false, an existing JP2 file with the same name won't be overwritten (default: false)
105
- # * :tmp_folder => the temporary folder to use when creating the jp2 (default: '/tmp'); also used by imagemagick
106
- #
107
- # Example:
108
- # source_img=Assembly::Image.new('/input/path_to_file.tif')
109
- # derivative_img=source_img.create_jp2(:overwrite=>true)
110
- # puts derivative_img.mimetype # 'image/jp2'
111
- # puts derivative_image.path # '/input/path_to_file.jp2'
112
- # rubocop:disable Metrics/CyclomaticComplexity:
113
- def create_jp2(params = {})
114
- Jp2Creator.create(self, params)
115
- end
116
-
117
- def samples_per_pixel
118
- if exif['samplesperpixel']
119
- exif['samplesperpixel'].to_i
120
- else
121
- case mimetype
122
- when 'image/tiff'
123
- 1
124
- when 'image/jpeg'
125
- 3
126
- end
127
- end
128
- end
129
-
130
- # Get size of image data in bytes
131
- def image_data_size
132
- (samples_per_pixel * height * width * bits_per_sample) / 8
133
- end
134
-
135
- private
136
-
137
- # rubocop:enable Metrics/CyclomaticComplexity
138
- def bits_per_sample
139
- if exif['bitspersample']
140
- exif['bitspersample'].to_i
141
- else
142
- case mimetype
143
- when 'image/tiff'
144
- 1
145
- end
146
- end
147
- end
148
- end
149
- end
@@ -1,102 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'logger'
4
- module Assembly
5
- # The Images class contains methods to operate on multiple images in batch.
6
- class Images
7
- def self.logger
8
- @logger ||= Logger.new(STDERR)
9
- end
10
-
11
- class << self
12
- attr_writer :logger
13
- end
14
-
15
- # Pass in a source path and have exif color profile descriptions added to all images contained.
16
- # This is useful if your source TIFFs do not have color profile descriptions in the EXIF data, but you know what it should be.
17
- # This will allow the images to pass the validty check and have JP2s created successfully.
18
- #
19
- # Note you will need full read/write access to the source path so that new EXIF data can be saved.
20
- #
21
- # @param [String] source path full path to the directory containing TIFFs
22
- # @param [String] profile_name profile name to be added, current options are 'Adobe RBG 1998','Dot Gain 20%','sRGB IEC61966-2.1'
23
- #
24
- # @param [Hash] params Optional parameters specified as a hash, using symbols for options:
25
- # * :force => if set to true, force overwrite a color profile description even if it already exists (default: false)
26
- # * :recusrive => if set to true, directories will be searched recursively for TIFFs from the source specified, false searches the top level only (default: false)
27
- # * :extension => defines the types of files that will be processed (default '.tif')
28
- #
29
- # Example:
30
- # Assembly::Images.batch_add_exif_profile_description('/full_path_to_tifs','Adobe RGB 1998')
31
- # rubocop:disable Metrics/MethodLength
32
- # rubocop:disable Metrics/AbcSize
33
- def self.batch_add_exif_profile_descr(source, profile_name, params = {})
34
- extension = params[:extension] || 'tif'
35
- recursive = params[:recursive] || false
36
- force = params[:force] || false
37
-
38
- raise 'Input path does not exist' unless File.directory?(source)
39
-
40
- # iterate over input directory looking for tifs
41
- pattern = recursive ? "**/*.#{extension}" : "*.#{extension}*"
42
- Dir.glob(File.join(source, pattern)).each do |file|
43
- img = Assembly::Image.new(file)
44
- logger.debug "Processing #{file}"
45
- img.add_exif_profile_description(profile_name, force)
46
- end
47
- 'Complete'
48
- end
49
- # rubocop:enable Metrics/MethodLength
50
- # rubocop:enable Metrics/AbcSize
51
-
52
- # Pass in a source path and get JP2s generate for each tiff that is in the source path
53
- #
54
- # If not passed in, the destination will be a "jp2" subfolder within the source folder.
55
- # Note you will need read access to the source path, and write access to the destination path.
56
- #
57
- # @param [String] source path full path to the directory containing TIFFs to be converted to JP2
58
- #
59
- # @param [Hash] params Optional parameters specified as a hash, using symbols for options:
60
- # * :output=>'/full/path_to_jp2' # specifies full path to folder where jp2s will be created (default: jp2 subdirectory from source path)
61
- # * :overwrite => if set to false, an existing JP2 file with the same name won't be overwritten (default: false)
62
- # * :recursive => if set to true, directories will be searched recursively for TIFFs from the source specified, false searches the top level only (default: false)
63
- # * :extension => defines the types of files that will be processed (default '.tif')
64
- #
65
- # Example:
66
- # Assembly::Images.batch_generate_jp2('/full_path_to_tifs')
67
- # rubocop:disable Metrics/MethodLength
68
- # rubocop:disable Metrics/AbcSize
69
- # rubocop:disable Metrics/CyclomaticComplexity
70
- # rubocop:disable Metrics/PerceivedComplexity
71
- def self.batch_generate_jp2(source, params = {})
72
- raise 'Input path does not exist' unless File.directory?(source)
73
-
74
- output = params[:output] || File.join(source, 'jp2') # default output directgory is jp2 sub-directory from source
75
- extension = params[:extension] || 'tif'
76
- overwrite = params[:overwrite] || false
77
- recursive = params[:recursive] || false
78
-
79
- Dir.mkdir(output) unless File.directory?(output) # attemp to make output directory
80
- raise 'Output path does not exist or could not be created' unless File.directory?(output)
81
-
82
- pattern = recursive ? "**/*.#{extension}" : "*.#{extension}*"
83
-
84
- # iterate over input directory looking for tifs
85
- Dir.glob(File.join(source, pattern)).each do |file|
86
- source_img = Assembly::Image.new(file)
87
- output_img = File.join(output, File.basename(file, File.extname(file)) + '.jp2') # output image gets same file name as source, but with a jp2 extension and in the correct output directory
88
- begin
89
- source_img.create_jp2(overwrite: overwrite, output: output_img)
90
- logger.debug "Generated jp2 for #{File.basename(file)}"
91
- rescue StandardError => e
92
- logger.debug "** Error for #{File.basename(file)}: #{e.message}"
93
- end
94
- end
95
- 'Complete'
96
- end
97
- # rubocop:enable Metrics/MethodLength
98
- # rubocop:enable Metrics/AbcSize
99
- # rubocop:enable Metrics/CyclomaticComplexity
100
- # rubocop:enable Metrics/PerceivedComplexity
101
- end
102
- end
data/spec/image_spec.rb DELETED
@@ -1,324 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'fileutils'
5
-
6
- RSpec.describe Assembly::Image do
7
- let(:assembly_image) { described_class.new(input_path) }
8
- let(:input_path) { TEST_TIF_INPUT_FILE }
9
- let(:jp2_output_file) { File.join(TEST_OUTPUT_DIR, File.basename(input_path).gsub('.tif', '.jp2')) }
10
-
11
- before { cleanup }
12
-
13
- describe '#jp2_filename' do
14
- it 'indicates the default jp2 filename' do
15
- expect(assembly_image.jp2_filename).to eq input_path.gsub('.tif', '.jp2')
16
- end
17
-
18
- context 'with a file with no extension' do
19
- let(:input_path) { '/path/to/a/file_with_no_extension' }
20
-
21
- it 'indicates the default jp2 filename' do
22
- expect(assembly_image.jp2_filename).to eq '/path/to/a/file_with_no_extension.jp2'
23
- end
24
- end
25
- end
26
-
27
- describe '#create_jp2' do
28
- context 'when input path is blank' do
29
- let(:input_path) { '' }
30
-
31
- it 'does not run if no input file is passed in' do
32
- expect { assembly_image.create_jp2 }.to raise_error(RuntimeError)
33
- end
34
- end
35
-
36
- context 'when given an uncompressed compressed RGB tif with more than 4GB of image data', skip: 'This test will create a 4GB test image and a 4GB temporary image, so skipping by default.' do
37
- let(:input_path) { File.join(TEST_INPUT_DIR, 'rgb.tif') }
38
-
39
- before do
40
- generate_test_image(input_path, compress: 'none', width: '37838', height: '37838')
41
- end
42
-
43
- it 'creates the jp2 with a temp file' do
44
- expect(File).to exist input_path
45
- expect(File).not_to exist jp2_output_file
46
- result = assembly_image.create_jp2(output: jp2_output_file)
47
- expect(assembly_image.tmp_path).not_to be_nil
48
- expect(result).to be_a_kind_of described_class
49
- expect(result.path).to eq jp2_output_file
50
- expect(jp2_output_file).to be_a_jp2
51
- expect(result.exif.colorspace).to eq 'sRGB'
52
- expect(result.height).to eq 37_838
53
- expect(result.width).to eq 37_838
54
- end
55
- end
56
-
57
- context 'when given an LZW compressed RGB tif with more than 4GB of image data', skip: 'This test will create a 4GB temporary image, so skipping by default.' do
58
- let(:input_path) { File.join(TEST_INPUT_DIR, 'lzw.tif') }
59
-
60
- before do
61
- generate_test_image(input_path, compress: 'lzw', width: '37838', height: '37838')
62
- end
63
-
64
- it 'creates the jp2 with a temp file' do
65
- expect(File).to exist input_path
66
- expect(File).not_to exist jp2_output_file
67
- expect(assembly_image.exif.samplesperpixel).to be 3
68
- expect(assembly_image.exif.bitspersample).to eql '8 8 8'
69
- expect(assembly_image).to be_a_valid_image
70
- expect(assembly_image).to be_jp2abl
71
- result = assembly_image.create_jp2(output: jp2_output_file)
72
- expect(assembly_image.tmp_path).not_to be_nil
73
- expect(result).to be_a_kind_of described_class
74
- expect(result.path).to eq jp2_output_file
75
- expect(jp2_output_file).to be_a_jp2
76
- expect(result.exif.colorspace).to eq 'sRGB'
77
- expect(result.height).to eq 37_838
78
- expect(result.width).to eq 37_838
79
- end
80
- end
81
-
82
- context 'when given a bitonal tif' do
83
- let(:input_path) { File.join(TEST_INPUT_DIR, 'bitonal.tif') }
84
-
85
- before do
86
- generate_test_image(input_path, color: 'bin', bands: 1, depth: 1)
87
- end
88
-
89
- it 'creates valid jp2' do
90
- expect(File).to exist input_path
91
- expect(File).not_to exist jp2_output_file
92
- expect(assembly_image.exif.samplesperpixel).to be 1
93
- expect(assembly_image.exif.bitspersample).to be 1
94
- expect(assembly_image).not_to have_color_profile
95
- result = assembly_image.create_jp2(output: jp2_output_file)
96
- expect(result).to be_a_kind_of described_class
97
- expect(result.path).to eq jp2_output_file
98
- expect(jp2_output_file).to be_a_jp2
99
- expect(result.exif.colorspace).to eq 'Grayscale'
100
- end
101
- end
102
-
103
- context 'when given a color tif but bitonal image data (1 channels and 1 bits per pixel)' do
104
- let(:input_path) { File.join(TEST_INPUT_DIR, 'color.tif') }
105
-
106
- before do
107
- generate_test_image(input_path, color: 'bin', bands: 3)
108
- end
109
-
110
- it 'creates color jp2' do
111
- expect(File).to exist input_path
112
- expect(File).not_to exist jp2_output_file
113
- expect(assembly_image).not_to have_color_profile
114
- expect(assembly_image.exif.samplesperpixel).to be 3
115
- expect(assembly_image.exif.bitspersample).to eql '8 8 8'
116
- expect(assembly_image).to be_a_valid_image
117
- expect(assembly_image).to be_jp2able
118
- result = assembly_image.create_jp2(output: jp2_output_file)
119
- expect(result).to be_a_kind_of described_class
120
- expect(result.path).to eq jp2_output_file
121
- expect(jp2_output_file).to be_a_jp2
122
- expect(result.exif.colorspace).to eq 'sRGB'
123
- end
124
- end
125
-
126
- context 'when given a graycale tif but with bitonal image data (1 channel and 1 bits per pixel)' do
127
- let(:input_path) { File.join(TEST_INPUT_DIR, 'gray.tif') }
128
-
129
- before do
130
- generate_test_image(input_path, color: 'grey', bands: 1)
131
- end
132
-
133
- it 'creates grayscale jp2' do
134
- expect(File).to exist input_path
135
- expect(File).not_to exist jp2_output_file
136
- expect(assembly_image).not_to have_color_profile
137
- expect(assembly_image.exif.samplesperpixel).to be 1
138
- expect(assembly_image.exif.bitspersample).to be 8
139
- expect(assembly_image).to be_a_valid_image
140
- expect(assembly_image).to be_jp2able
141
- result = assembly_image.create_jp2(output: jp2_output_file)
142
- expect(jp2_output_file).to be_a_jp2
143
- expect(result).to be_a_kind_of described_class
144
- expect(result.path).to eq jp2_output_file
145
- expect(result.exif.colorspace).to eq 'Grayscale'
146
- end
147
- end
148
-
149
- context 'when given a color tif but with greyscale image data (1 channel and 8 bits per pixel)' do
150
- let(:input_path) { File.join(TEST_INPUT_DIR, 'color_gray.tif') }
151
-
152
- before do
153
- generate_test_image(input_path, color: 'grey')
154
- end
155
-
156
- it 'creates color jp2' do
157
- expect(File).to exist input_path
158
- expect(File).not_to exist jp2_output_file
159
- expect(assembly_image.exif.samplesperpixel).to be 3
160
- expect(assembly_image.exif.bitspersample).to eql '8 8 8'
161
- expect(assembly_image).to be_a_valid_image
162
- expect(assembly_image).to be_jp2able
163
- expect(assembly_image).not_to have_color_profile
164
- result = assembly_image.create_jp2(output: jp2_output_file)
165
- expect(result).to be_a_kind_of described_class
166
- expect(result.path).to eq jp2_output_file
167
- expect(jp2_output_file).to be_a_jp2
168
- expect(result.exif.colorspace).to eq 'sRGB'
169
- end
170
- end
171
-
172
- context 'when given a cmyk tif' do
173
- let(:input_path) { File.join(TEST_INPUT_DIR, 'cmky.tif') }
174
-
175
- before do
176
- generate_test_image(input_path, color: 'cmyk', cg_type: 'cmyk', profile: 'cmyk', bands: 4)
177
- end
178
-
179
- it 'creates an srgb jp2', skip: 'Need to verify the color space is correct in jp2' do
180
- expect(File).to exist input_path
181
- expect(File).not_to exist jp2_output_file
182
- expect(assembly_image.exif.samplesperpixel).to be 4
183
- expect(assembly_image.exif.bitspersample).to eql '8 8 8 8'
184
- expect(assembly_image).to be_a_valid_image
185
- expect(assembly_image).to be_jp2able
186
- expect(assembly_image).to have_color_profile
187
- result = assembly_image.create_jp2(output: jp2_output_file)
188
- expect(result).to be_a_kind_of described_class
189
- expect(result.path).to eq jp2_output_file
190
- expect(jp2_output_file).to be_a_jp2
191
- # note, we verify the CMYK has been converted to an SRGB JP2 correctly by using ruby-vips instead of exif, since exif does not correctly
192
- # identify the color space...note: this line current does not work in circleci, potentially due to libvips version differences
193
- expect(Vips::Image.new_from_file(jp2_output_file).get_value('interpretation')).to eq :srgb
194
- end
195
- end
196
-
197
- context 'when the source image has no profile' do
198
- let(:input_path) { File.join(TEST_INPUT_DIR, 'no_profile.tif') }
199
-
200
- before do
201
- generate_test_image(input_path)
202
- end
203
-
204
- it 'creates a jp2' do
205
- expect(File).to exist input_path
206
- expect(File).not_to exist jp2_output_file
207
- expect(assembly_image.exif.samplesperpixel).to be 3
208
- expect(assembly_image.exif.bitspersample).to eql '8 8 8'
209
- expect(assembly_image).not_to have_color_profile
210
- expect(assembly_image).to be_a_valid_image
211
- expect(assembly_image).to be_jp2able
212
- assembly_image.create_jp2(output: jp2_output_file)
213
- expect(jp2_output_file).to be_a_jp2
214
- end
215
- end
216
-
217
- context "when the output file exists and you don't allow overwriting" do
218
- before do
219
- generate_test_image(input_path)
220
- FileUtils.touch(jp2_output_file) # just need a file with this name, don't care what
221
- end
222
-
223
- it 'does not run' do
224
- expect(File).to exist input_path
225
- expect(File).to exist jp2_output_file
226
- expect { assembly_image.create_jp2(output: jp2_output_file) }.to raise_error(SecurityError)
227
- end
228
- end
229
-
230
- context 'when given a test tiff' do
231
- before do
232
- generate_test_image(input_path)
233
- end
234
-
235
- it 'gets the correct image height and width' do
236
- expect(assembly_image.height).to eq 36
237
- expect(assembly_image.width).to eq 43
238
- end
239
- end
240
-
241
- context 'when the input file is a jp2' do
242
- before do
243
- generate_test_image(input_path)
244
- end
245
-
246
- it 'does not run' do
247
- expect(File).to exist input_path
248
- expect(File).not_to exist jp2_output_file
249
- expect(assembly_image).not_to have_color_profile
250
- expect(assembly_image).to be_a_valid_image
251
- expect(assembly_image).to be_jp2able
252
- assembly_image.create_jp2(output: jp2_output_file)
253
- expect(jp2_output_file).to be_a_jp2
254
- jp2_file = described_class.new(jp2_output_file)
255
- expect(jp2_file).to be_valid_image
256
- expect(jp2_file).not_to be_jp2able
257
- expect { jp2_file.create_jp2 }.to raise_error(RuntimeError)
258
- end
259
- end
260
-
261
- context 'when you specify a bogus output profile' do
262
- before do
263
- generate_test_image(input_path)
264
- end
265
-
266
- it 'runs, because this is not currently an option' do
267
- expect(File).to exist input_path
268
- result = assembly_image.create_jp2(output_profile: 'bogusness')
269
- expect(result).to be_a_kind_of described_class
270
- expect(result.path).to eq TEST_JP2_INPUT_FILE
271
- expect(TEST_JP2_INPUT_FILE).to be_a_jp2
272
- expect(result.exif.colorspace).to eq 'sRGB'
273
- end
274
- end
275
-
276
- context 'when an invalid tmp folder' do
277
- before do
278
- generate_test_image(TEST_JPEG_INPUT_FILE)
279
- end
280
-
281
- let(:input_path) { TEST_JPEG_INPUT_FILE }
282
-
283
- it 'does not run' do
284
- bogus_folder = '/crapsticks'
285
- expect(File).to exist TEST_JPEG_INPUT_FILE
286
- expect(File).not_to exist bogus_folder
287
- expect { assembly_image.create_jp2(tmp_folder: bogus_folder) }.to raise_error(RuntimeError)
288
- end
289
- end
290
-
291
- context 'when no output file is specified' do
292
- before do
293
- generate_test_image(input_path)
294
- end
295
-
296
- it 'creates a jp2 of the same filename and in the same location as the input and cleans up the tmp file' do
297
- expect(File).to exist input_path
298
- expect(File.exist?(TEST_JP2_INPUT_FILE)).to be false
299
- result = assembly_image.create_jp2
300
- expect(result).to be_a_kind_of described_class
301
- expect(result.path).to eq TEST_JP2_INPUT_FILE
302
- expect(TEST_JP2_INPUT_FILE).to be_a_jp2
303
- expect(result.exif.colorspace).to eq 'sRGB'
304
- end
305
- end
306
-
307
- context 'when the output file exists and you allow overwriting' do
308
- before do
309
- generate_test_image(input_path)
310
- FileUtils.touch(jp2_output_file) # just need a file with this name, don't care what
311
- end
312
-
313
- it 'recreates jp2' do
314
- expect(File).to exist input_path
315
- expect(File).to exist jp2_output_file
316
- result = assembly_image.create_jp2(output: jp2_output_file, overwrite: true)
317
- expect(result).to be_a_kind_of described_class
318
- expect(result.path).to eq jp2_output_file
319
- expect(jp2_output_file).to be_a_jp2
320
- expect(result.exif.colorspace).to eq 'sRGB'
321
- end
322
- end
323
- end
324
- end
data/spec/images_spec.rb DELETED
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe Assembly::Images do
6
- before { cleanup }
7
-
8
- describe '#batch_generate_jp2' do
9
- it 'does not run if no input folder is passed in' do
10
- expect{ described_class.batch_generate_jp2('') }.to raise_error(RuntimeError)
11
- end
12
-
13
- it 'does not run if a non-existent input folder is passed in' do
14
- expect{ described_class.batch_generate_jp2('/junk/path') }.to raise_error(RuntimeError)
15
- end
16
-
17
- it 'runs and batch produces jp2s from input tiffs' do
18
- ['test1', 'test2', 'test3'].each { |image| generate_test_image(File.join(TEST_INPUT_DIR, "#{image}.tif"), profile: 'AdobeRGB1998') }
19
- described_class.batch_generate_jp2(TEST_INPUT_DIR, output: TEST_OUTPUT_DIR)
20
- expect(File.directory?(TEST_OUTPUT_DIR)).to be true
21
- ['test1', 'test2', 'test3'].each { |image| expect(File.join(TEST_OUTPUT_DIR, "#{image}.jp2")).to be_a_jp2 }
22
- end
23
- end
24
-
25
- describe '#batch_add_exif_profile_descr' do
26
- it 'runs and batch adds color profile descriptions to input tiffs that had no color profile descriptions' do
27
- ['test1', 'test2', 'test3'].each { |image| generate_test_image(File.join(TEST_INPUT_DIR, "#{image}.tif")) }
28
- ['test1', 'test2', 'test3'].each { |image| expect(Assembly::Image.new(File.join(TEST_INPUT_DIR, "#{image}.tif")).exif.profiledescription).to be_nil }
29
- described_class.batch_add_exif_profile_descr(TEST_INPUT_DIR, 'Adobe RGB 1998')
30
- ['test1', 'test2', 'test3'].each { |image| expect(Assembly::Image.new(File.join(TEST_INPUT_DIR, "#{image}.tif")).exif.profiledescription).to eq 'Adobe RGB (1998)' }
31
- end
32
-
33
- it 'runs and batch adds color profile descriptions to input tiffs, forcing over existing color profile descriptions' do
34
- ['test1', 'test2', 'test3'].each { |image| generate_test_image(File.join(TEST_INPUT_DIR, "#{image}.tif"), profile: 'sRGBIEC6196621') }
35
- ['test1', 'test2', 'test3'].each { |image| expect(Assembly::Image.new(File.join(TEST_INPUT_DIR, "#{image}.tif")).exif.profiledescription).to eq 'sRGB IEC61966-2.1' }
36
- described_class.batch_add_exif_profile_descr(TEST_INPUT_DIR, 'Adobe RGB 1998', force: true) # force overwrite
37
- ['test1', 'test2', 'test3'].each { |image| expect(Assembly::Image.new(File.join(TEST_INPUT_DIR, "#{image}.tif")).exif.profiledescription).to eq 'Adobe RGB (1998)' }
38
- end
39
-
40
- it 'runs and batch adds color profile descriptions to input tiffs, not overwriting existing color profile descriptions' do
41
- ['test1', 'test2', 'test3'].each { |image| generate_test_image(File.join(TEST_INPUT_DIR, "#{image}.tif"), profile: 'sRGBIEC6196621') }
42
- ['test1', 'test2', 'test3'].each { |image| expect(Assembly::Image.new(File.join(TEST_INPUT_DIR, "#{image}.tif")).exif.profiledescription).to eq 'sRGB IEC61966-2.1' }
43
- described_class.batch_add_exif_profile_descr(TEST_INPUT_DIR, 'Adobe RGB 1998') # do not force overwrite
44
- ['test1', 'test2', 'test3'].each { |image| expect(Assembly::Image.new(File.join(TEST_INPUT_DIR, "#{image}.tif")).exif.profiledescription).to eq 'sRGB IEC61966-2.1' }
45
- end
46
- end
47
- end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file