回形针处理器从其他样式生成图像

时间:2014-03-26 12:08:44

标签: ruby-on-rails paperclip

我试着找方法写Paperclip处理器,它根据其他风格生成图像。

我需要生成尺寸为#34; 54x54"然后生成另一种尺寸为120x120的样式,基于" 54x54"风格(背景+小图片)。

型号:

class Medal < ActiveRecord::Base

  has_attached_file :icon,
                    styles: {
                      :'48'  => ['48', :png],
                      :'54'  => ['54', :png],
                      :'120' => ['120', :png],
                      :'fb' => { geometry: '120', format: :png, processors: [ :fb_medal_icon ] },
                    }

end

处理器:

module Paperclip
  class FbMedalIcon < Processor

    def initialize(file, options = {}, attachment = nil)
      super
      @whiny    = options[:whiny].nil? ? true : options[:whiny]
      @format   = File.extname(@file.path)
      @basename = File.basename(@file.path, @format)
    end

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

      begin
        arguments = '-gravity center :icon :background :dest'

        options = {
          icon:       icon_path,
          background: "#{File.expand_path(src.path)}[0]",
          dest:       File.expand_path(dst.path)
        }

        composite(arguments, options)
      rescue Cocaine::ExitStatusError
        raise Paperclip::Error, "There was an error processing the icon for #{@basename}" if @whiny
      rescue Cocaine::CommandNotFoundError
        raise Paperclip::Errors::CommandNotFoundError.new("Could not run the `composite` command. Please install ImageMagick.")
      end

      dst
    end

    def composite(arguments = "", local_options = {})
      Paperclip.run('composite', arguments, local_options)
    end

    private

    def icon_path
      style = :'54'
      icon  = @attachment.instance.icon

      if icon.queued_for_write[style].present?
        icon.queued_for_write[style].path
      else
        Paperclip.io_adapters.for(icon.styles[style]).path
      end
    end

  end
end

但是我得到了错误&#34; NoMethodError:未定义的方法`path&#39;为零:NilClass&#34;

from ruby-1.9.3-p484/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:174:in `staged_path'
from ruby-1.9.3-p484/gems/paperclip-4.1.1/lib/paperclip/io_adapters/attachment_adapter.rb:25:in `copy_to_tempfile'
from ruby-1.9.3-p484/gems/paperclip-4.1.1/lib/paperclip/io_adapters/attachment_adapter.rb:19:in `cache_current_values'
from ruby-1.9.3-p484/gems/paperclip-4.1.1/lib/paperclip/io_adapters/attachment_adapter.rb:11:in `initialize'
from ruby-1.9.3-p484/gems/paperclip-4.1.1/lib/paperclip/io_adapters/registry.rb:31:in `new'
from ruby-1.9.3-p484/gems/paperclip-4.1.1/lib/paperclip/io_adapters/registry.rb:31:in `for'
from /my_projects/MyApp/lib/paperclip_processors/fb_medal_icon.rb:63:in `icon_path'
from /my_projects/MyApp/lib/paperclip_processors/fb_medal_icon.rb:24:in `make'

知道如何处理这种情况吗?

1 个答案:

答案 0 :(得分:0)

您没有提到为什么使用自己的处理器,但我强烈建议使用using ImageMagick来处理样式

如果您安装ImageMagick(它可能是Windows上的一个问题),您将能够在不使用自定义处理器的情况下获得样式。如果你想看

我有代码