5月 18 2008
ドロップシャドウをつけるRubyスクリプト
三国志大戦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) のメソッド一覧には目を通しておいて何がさくっとできるかは把握しておきたい。

