attachment_へfuピクチャ圧縮処理を追加する機能

2414 ワード

JavaEyeは、個人のアイコン、ブログのアルバム、投稿の添付ファイルなど、多くの画像をアップロードする機能を提供しています.
attachment_fuプラグインで実装されています.
画像が大きすぎて、ユーザーに閲覧速度の面倒をもたらすことを避けるために、私たちは最近画像圧縮機能を加えました:例えばユーザーがアップロードしたのはBMPフォーマットで、自動的にPNGに変換します.例えばユーザは動的GIFアバターをアップロードし,自動的に第1フレームをアバターとして取得する.
そしてattachment_fuプラグイン自体にはこの機能はありません.どのように実現するかを見てみましょう.
attachment_fuは複数の画像処理をサポートするライブラリで、mini_をお勧めします.magick、次のコードはこれを例に、MiniMagick::Imageに圧縮を追加する方法:

module MiniMagick
  class Image
    def compressing(convert_gif)
      format = self[:format]
      if convert_gif && format == "GIF"
        #convert 1st frame for animation gif
        run_command("convert","#{@path}[0]", "#{@path}")
      elsif format == "BMP"
        format("PNG")
      end
    end
  end
end

そしてattachmentを変更するだけですfuプラグインのソースコード、mini_magick_processor.rbのresize_imageメソッドの最初に行を追加します.
img.compressing(true)

プロセスでattachment_with_プロセスメソッド修正with_image block、2行追加:

img.compressing(false)
self.temp_path = img

しかし、このようにするには欠点があります.pluginのソースコードを直接修正する必要があります.このようにpluginをアップグレードするとき、自分がした変更を覚えてから、手動でマージしなければなりません.ruby open classのプロパティを使用して、外部で変更できます.

Technoweenie::AttachmentFu::Processors::MiniMagickProcessor.module_eval do
  def resize_image_with_compressing(img, size)
    img.compressing(true)
    resize_image_without_compressing(img, size)
  end
  
  alias_method_chain :resize_image, :compressing
  
  def process_attachment_with_processing_with_compressing
    with_image do |img|
      img.compressing(false)
      self.temp_path = img
    end if image?
    process_attachment_with_processing_without_compressing
  end
  
  alias_method_chain :process_attachment_with_processing, :compressing
end

このコードと最初の圧縮方法のコードをinitializerに入れることで、侵入のないplugin hackを実現することができます.コードは直接修正するよりも複雑ですが、pluginのアップグレードとメンテナンスに便利です.他のプラグインがあればカスタマイズする必要があります.この方法を採用することも考えられます.
フォーマット変換が圧縮効果に達するほか、より高いPNGまたはJPGフォーマットの圧縮率を使用したり、透かし機能を追加したりすることができます.具体的なコマンドapiはmagickドキュメントを参照することができます.