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