3

これは、この質問に対する回答を求める別の質問です。

私の透かしプロセッサでは、透かし画像のパスを静的な透かし画像に設定すると、すべて正常に機能します。

透かし、ギャラリー、写真の 3 つのモデルがあります。透かしhas_many :galleries。ギャラリーbelongs_to :watermarkhas_many :photos. 写真belongs_to :gallerymount_uploader :image, PhotoUploader.

photo_uploader.rb でやりたいことは次のとおりです。

  version :large do
    process :watermark
    process :resize_to_limit => [600, 600]
  end

  def watermark
    manipulate! do |img|
      watermark = Magick::Image.read(model.gallery.watermark.image_url).first
      img = img.composite(watermark, Magick::CenterGravity, Magick::OverCompositeOp)
    end
  end

モデルのメソッド/属性の使用は store_dir メソッドでは正常に機能しますが、ウォーターマーク プロセッサでは機能しません。model.gallery.watermark.image_url 引数を透かしプロセッサに渡すにはどうすればよいですか?

4

1 に答える 1

1

問題は、画像がモデルにマウントされるまでに、アップローダ クラス内のウォーターマーク定義内の変数が avialiabled でないことです。それがしたことです。私はmongoDBを扱うためにmongoidを使用しています。モデル内にパラメーターを設定します。これにより、必要な値が保持されます。値 the_current_model.gallery.watermark.image_url。このパラメーターは user_image になります。

class Asset
  include Mongoid::Document
  mount_uploader :image, AssetUploader

  field :user_image

  attr_accessible :user_image

  after_save :mark_it

  private
  def mark_it
    image.recreate_versions! if user_image.present?
  end

end

この問題を解決するための鍵は、データがデータベースに保存され、パラメーター user_image がアップローダー クラスに使用できるようになった後で、画像を再作成することです (mark_it def を呼び出すモデルで見られるように)。

class AssetUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick

  storage :file
  # storage :fog

  after :cache, :unlink_original_cache

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  # def default_url
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  # end

  process :resize_to_fit => [800, 800]
  process :quality => 80

  version :thumb do
    process :resize_to_fit => [200, 200]
  end

  version :large do
    process :watermark
  end

  def watermark
    if model.user_name.present?
      manipulate! do |img|
        text = Magick::Draw.new 
        text.gravity = Magick::CenterGravity
        text.fill = 'white'    
        text.pointsize = 40 
        text.stroke = 'none' 
        text.annotate(img, 0, 0, 0, 0, "#{model.user_name}") 
        img
      end
    end
  end

  def unlink_original(file)
    File.delete path if version_name.blank?
  end

  def unlink_original_cache(file)
    File.delete if version_name.blank?
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  # def filename
  #   "something.jpg" if original_filename
  # end

end

鍵はここにあります:

def watermark
        if model.user_name.present?
          manipulate! do |img|
            text = Magick::Draw.new 
            text.gravity = Magick::CenterGravity
            text.fill = 'white'    
            text.pointsize = 40 
            text.stroke = 'none' 
            text.annotate(img, 0, 0, 0, 0, "#{model.user_name}") 
            img
          end
        end
      end

メソッド watermark は、モデルの user_name パラメータが設定されている (データベースで作成された) 場合にのみ、透かしを含む画像を作成します。したがって、データがデータベースに保存されると、このパラメータはアップローダ クラスで必要に応じて使用できるようになります。

それが私がやったことで、とてもうまくいきました!お役に立てば幸いです!

于 2012-03-13T13:24:14.300 に答える