lib/hydra/derivatives/jpeg2k_image.rb in hydra-derivatives-0.1.0 vs lib/hydra/derivatives/jpeg2k_image.rb in hydra-derivatives-0.1.1
- old
+ new
@@ -6,23 +6,20 @@
module Derivatives
class Jpeg2kImage < Processor
include ShellBasedProcessor
def process
- quality, colorspace = extract_quality_and_colorspace
+ image = MiniMagick::Image.read(source_datastream.content)
+ quality = image['%[channels]'] == 'gray' ? 'gray' : 'color'
directives.each do |name, args|
- file_path = nil
- long_dim = nil
+ long_dim = self.class.long_dim(image)
+ file_path = self.class.tmp_file('.tif')
to_srgb = args.fetch(:to_srgb, true)
if args[:resize] || to_srgb
- image = preprocess(resize: args[:resize], to_srgb: to_srgb, src_quality: quality)
- long_dim = self.class.long_dim(image)
- file_path = self.class.tmp_file('.tif')
- image.write file_path
- else
- long_dim = self.class.long_dim(MiniMagick::Image.read(source_datastream.content))
+ preprocess(image, resize: args[:resize], to_srgb: to_srgb, src_quality: quality)
end
+ image.write file_path
recipe = self.class.kdu_compress_recipe(args, quality, long_dim)
output_datastream_name = args[:datastream] || output_datastream_id(name)
encode_datastream(output_datastream_name, recipe, file_path: file_path)
File.unlink(file_path) unless file_path.nil?
end
@@ -41,29 +38,19 @@
object.add_file_datastream(out_file.read, dsid: dest_dsid, mimeType: 'image/jp2')
File.unlink(output_file)
end
protected
- def preprocess(opts={})
- # resize: <geometry>, to_srgb: <bool>,src_quality: 'color'|'grey'
- image = MiniMagick::Image.read(source_datastream.content)
+ def preprocess(image, opts={})
+ # resize: <geometry>, to_srgb: <bool>, src_quality: 'color'|'gray'
image.combine_options do |c|
c.resize(opts[:resize]) if opts[:resize]
c.profile self.class.srgb_profile_path if opts[:src_quality] == 'color' && opts[:to_srgb]
end
image
end
- def extract_quality_and_colorspace
- xml = source_datastream.extract_metadata
- doc = Nokogiri::XML(xml).remove_namespaces!
- bps = doc.xpath('//bitsPerSample').first.content
- quality = bps == '8 8 8' ? 'color' : 'grey'
- colorspace = doc.xpath('.//colorSpace').first.content
- [quality, colorspace]
- end
-
def self.encode(path, recipe, output_file)
kdu_compress = Hydra::Derivatives.kdu_compress_path
execute "#{kdu_compress} -i #{path} -o #{output_file} #{recipe}"
end
@@ -87,11 +74,11 @@
if args[:recipe].is_a? Symbol
recipe = [args[:recipe].to_s, quality].join('_')
if Hydra::Derivatives.kdu_compress_recipes.has_key? recipe
return Hydra::Derivatives.kdu_compress_recipes[recipe]
else
- logger.warn "No JP2 recipe for :#{args[:recipe].to_s} ('#{recipe}') found in configuration. Using best guess."
+ Logger.warn "No JP2 recipe for :#{args[:recipe].to_s} ('#{recipe}') found in configuration. Using best guess."
return Hydra::Derivatives::Jpeg2kImage.calculate_recipe(args,quality,long_dim)
end
elsif args[:recipe].is_a? String
return args[:recipe]
else
@@ -102,10 +89,10 @@
def self.calculate_recipe(args, quality, long_dim)
levels_arg = args.fetch(:levels, Hydra::Derivatives::Jpeg2kImage.level_count_for_size(long_dim))
rates_arg = Hydra::Derivatives::Jpeg2kImage.layer_rates(args.fetch(:layers, 8), args.fetch(:compression, 10))
tile_size = args.fetch(:tile_size, 1024)
tiles_arg = "\{#{tile_size},#{tile_size}\}"
- jp2_space_arg = quality == 'grey' ? 'sLUM' : 'sRGB'
+ jp2_space_arg = quality == 'gray' ? 'sLUM' : 'sRGB'
%Q{-rate #{rates_arg}
-jp2_space #{jp2_space_arg}
-double_buffering 10
-num_threads 4