更改Paperclip图像处理器的顺序

时间:2015-09-11 22:19:10

标签: ruby-on-rails ruby-on-rails-4 paperclip

我正在使用Paperclip创建缩略图并为上传的图像应用水印。问题是缩略图是从水印图像而不是原始图像创建的。

如何从原始文件制作缩略图?

型号

    has_attached_file :image,processors:[:thumbnail, :watermark], styles:{thumb:"240x240#", original: {watermark_path: "#Rails.root}/public/images/watermark.png"}}

水印处理器

 module Paperclip
 class Watermark < Processor

attr_accessor :current_geometry, :target_geometry, :format, :whiny, :convert_options, :watermark_path, :overlay, :position

def initialize file, options = {}, attachment = nil
  super
  geometry = options[:geometry]
  @file    = file

  if geometry.present?
    @crop = geometry[-1, 1] == '#'
  end

  @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]
  @overlay          = options[:overlay].nil? ? true : false
  @current_format   = File.extname(@file.path)
  @basename         = File.basename(@file.path, @current_format)
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

  return @file unless watermark_path

  dst = Tempfile.new([@basename, @format].compact.join("."))
  dst.binmode

  command = "convert"
  params  = [fromfile]
  params  += transformation_command
  params << tofile(dst)

  begin
    success = Paperclip.run(command, params.flatten.compact.collect { |e| "'#{e}'" }.join(" "))
  rescue Paperclip::Errors::CommandNotFoundError
    raise Paperclip::Errors::CommandNotFoundError, "There was an error resizing and cropping #{@basename}" if @whiny
  end

  if watermark_path

    command = "composite"
    params  = %W[-gravity #{@position} #{watermark_path} #{tofile(dst)}]

    params << tofile(dst)

    begin
      success = Paperclip.run(command, params.flatten.compact.collect { |e| "'#{e}'" }.join(" "))
    rescue Paperclip::Errors::CommandNotFoundError
      raise Paperclip::Errors::CommandNotFoundError, "There was an error processing the watermark for #{@basename}" if @whiny
    end
  end

  dst
end


def fromfile
  File.expand_path(@file.path)
end

def tofile(destination)
  File.expand_path(destination.path)
end

def transformation_command
  if @target_geometry.present?
    scale, crop = @current_geometry.transformation_to(@target_geometry, crop?)
    trans       = %W[-resize #{scale}]
    trans       += %W[-crop #{crop} +repage] if crop
    trans << convert_options if convert_options?
    trans
  else
    scale, crop = @current_geometry.transformation_to(@current_geometry, crop?)
    trans       = %W[-resize #{scale}]
    trans       += %W[-crop #{crop} +repage] if crop
    trans << convert_options if convert_options?
    trans
  end
 end
 end
 end 

0 个答案:

没有答案