5月 18 2008

ドロップシャドウをつけるRubyスクリプト

Published by HoLY at 4:23:49 under tech

三国志大戦3Master のデータを作っていて、既存の大量の画像にドロップシャドウを付けたものが必要になったので、RMagick を使ったRubyスクリプトなどを書いてみた。

方法。

ImageList#shadow メソッドが用意されているものの、まったくうまく動かず(動かし方があるなら教えて…)。

マニュアルにわざわざ作り方が書いてある 程度にFAQだけど、

  • 画像をグレーにする
  • 適度にずらす
  • ブラーかける

で影をつくり、その上に元画像を重ねる。 ついでにコマンドラインオプションを設定して完成。

透過処理のあたりがいまいちだけど手元の用途では使えたのでよしとする。

dropshadow.rb

#!/usr/local/bin/ruby
require 'RMagick'
include Magick

def create_shadow(img, options = {})
  config = {
    :background => 'white',
    :color => 'black',
    :radius => 5,
    :offset_x => 0,
    :offset_y => 0,
    #:transparent => 'white',
  }.merge(options)

  # きかない!
  #shadow = img.shadow(4, 4, 4.0, 0.1)
  #shadow.write(dst)

  img.fuzz = '50%'
  img = img.transparent(config[:transparent], Magick::TransparentOpacity) if config[:transparent]

  shadow = img.clone
  shadow = shadow.colorize(0.75,0.75,0.75,config[:color])
  shadow = shadow.border(config[:radius], config[:radius], config[:background])
  shadow = shadow.gaussian_blur(config[:radius]*2, 5.0)

  shadow.composite(img, 0, 0, OverCompositeOp)
end

def convert(src, dst, options = {})
  img = ImageList.new(src)

  shadowed = create_shadow(img, options)
  shadowed.write(dst)
end

if $0 == __FILE__

  require 'optparse'
  def parse_options
    options = Hash.new
    argv = ARGV.options do |opts|
      opts.on('-b', '--background=COLOR') {|v| options[:background] = v }
      opts.on('-c', '--color=COLOR') { |v| options[:color] = v }
      opts.on('-r', '--radius') { |v| options[:radius] = v }
      opts.on('-t', '--transparent=COLOR') { |v| options[:transparent] = v }
      opts.parse!
    end
    options
  end
  if ARGV.size >= 2
    convert(ARGV[0], ARGV[1], parse_options)
  else
    warn "[usage]: #{$0} src dist"
  end

end

RMagick (および ImageMagick) のメソッド一覧には目を通しておいて何がさくっとできるかは把握しておきたい。

Trackback URI | Comments RSS

Leave a Reply