Скрепка для водяных знаков
У меня проблемы с выполнением команды в моем процессоре. Эта же команда работает в консоли. По сути, мне нужно использовать две команды в одной - конвертировать и комбинировать с плиткой, чтобы водяной знак повторялся по всему изображению.
Команда, которую я запустил в консоли:
run_string = "convert utah.jpg -resize 1200x1200 miff:- | composite -tile Watermark-Photo.png - utah2.jpg"=> "convert utah.jpg -resize 1200x1200 miff:- | composite -tile Watermark-Photo.png - utah2.jpg"
Paperclip.run run_string
И результат был идеальным. Тем не менее, когда я положил его в свой процессор:
module Paperclip
class Watermark < Processor
def initialize(file, options = {}, attachment = nil)
super
geometry = options[:geometry]
@file = file
@crop = geometry[-1,1] == '#'
@target_geometry = Geometry.parse geometry
@current_geometry = Geometry.from_file @file
@convert_options = options[:convert_options]
@whiny = options[:whiny].nil? ? true : options[:whiny]
@format = options[:format]
@watermark_path = options[:watermark_path]
@position = options[:position].nil? ? "SouthEast" : options[:position]
@watermark_offset = options[:watermark_offset]
@overlay = options[:overlay].nil? ? true : false
@current_format = File.extname(@file.path)
@basename = File.basename(@file.path, @current_format)
Rails.logger.info "watermark initialized"
end
# Returns true if the +target_geometry+ is meant to crop.
def crop?
@crop
end
# Returns true if the image is meant to make use of additional convert options.
def convert_options?
not @convert_options.blank?
end
# Performs the conversion of the +file+ into a watermark. Returns the Tempfile
# that contains the new image.
def make
Rails.logger.info "watermark make method"
src = @file
dst = Tempfile.new([@basename].compact.join("."))
dst.binmode
if @watermark_path.present?
# params = ["convert"]
# params += %W[#{fromfile}]
# params += transformation_command
# params += %W[| composite -tile #{@watermark_path} -]
# params << "#{tofile(dst)}"
run_string = "convert '#{fromfile}' #{transformation_command.join(' ')} | composite -tile '#{@watermark_path}' - '#{tofile(dst)}'"
else
# params = ["convert"]
# params += ["'#{fromfile}'"]
# params += transformation_command
# params << "'#{tofile(dst)}'"
run_string = "convert '#{fromfile}' #{transformation_command.join(' ')} '#{tofile(dst)}'"
end
Rails.logger.info 'params:' + run_string
begin
# Paperclip.run(params.join(' '))
Paperclip.run(run_string)
rescue ArgumentError, Cocaine::CommandLineError
raise Paperclip::Error.new("There was an error processing the watermark for #{@basename}") if @whiny
end
dst
end
def transformation_command
scale, crop = @current_geometry.transformation_to(@target_geometry, crop?)
trans = %W[-resize #{scale}]
trans += %W[-crop #{crop} +repage] if crop
trans += %W[miff:- ]
trans << @convert_options if @convert_options.present?
trans
end
def fromfile
File.expand_path(@file.path)
end
def tofile(destination)
File.expand_path(destination.path)
end
end
end
Я вижу из журнала, что он выполняет команду:
Command :: convert '/tmp/7179f28e8260099624b8c2e7e8fe8fb420170902-1-1ud7pah.jpg' -resize 600x600> miff:- | composite -tile '/storycraftstock/app/assets/images/Watermark-Photo.png' - '/tmp/7179f28e8260099624b8c2e7e8fe8fb420170902-1-1ud7pah20170902-1-1kbmamu'
Дает эту неопределенную ошибку:
exception while processing Spree::Image ID 11:
There was an error processing the watermark for 32a2a05e7393f7ddc78f0134bcf32e4a20170902-1-19oyq1j
Как вы можете видеть, я прокомментировал много вещей в коде только для того, чтобы заставить его работать, но все же не повезло. Любой идеал, что я делаю не так?