English Korean Chinese

RubyでCGI・入門編

今野 滋

UNIXコマンドを実行する(画像処理)

カウンターやサムネイル式画像掲示板を作るためには、画像を自動で加工できなければなりません。Ruby 自体には画像加工の機能はありませんが、私たちのサーバーにはImageMagickがインストールされているので、これを使うことができます。

ImageMagickの使い方はマニュアルを見れば良いのですが、英語です。コマンドの説明を、日本人向けに簡潔にまとめたページがありますので、そちらが参考になると思います。これはWindows版の解説ですが、UNIX版と、ほぼ共通です。
http://hashi4.civil.tohoku.ac.jp/soft/node43.html  © Takashi CHIBA

チャレンジ:UNIXで画像処理

試しにテスト用画像の上下をひっくり返してみましょう。

  1. Terminalでログインして、画像のあるディレクトリに移動。
    cd www/test
  2. 下記のコマンドは、usagi.gif をひっくり返して、usagi2.gif という名前で保存します。やってみてください。
    convert -flip usagi.gif usagi2.gif
  3. FTPで、画像のあるディレクトリにアクセスし、usagi2.gif をダウンロードして内容を確認。
    もし、usagi2.gif が見当たらなかったら、リロードボタンボタン画像を押してみてください。
  4. 画像の上下が反転していることを確認できましたでしょうか? -flip は上下反転のオプションです。
  5. 他にも様々なオプションを指定して、効果を確かめてください。

RubyにUNIXコマンドを実行させる

UNIXコマンドをRubyに実行させるには、以下の2つの方法があります。
例:hoge1 hoge2 hoge3 というUNIXコマンドがあったとすると、
  バッククォートを使って、`hoge1 hoge2 hoge3`
  または、systemコマンドを使って、system("hoge1","hoge2","hoge3")
たぶん、一般性や安定性の点で、後者の方がおすすめです。

hello.cgi の中身を下記のように書き直してFTP転送します。

#!/usr/local/bin/ruby
system("convert","-negate","usagi.gif","usagi3.gif")
puts "Location: ./usagi3.gif"
puts

前節のように、ブラウザで表示を確認してみてください。
色が反転した画像になっていますでしょうか? オプション-negateは色を反転させます。
testpage.html で、画像が変わらなかった場合は、ブラウザのリロードボタンを押してみてください。

画像を連結してみましょう。hello.cgi の中身をさらに下記のように書き直してFTP転送します。

#!/usr/local/bin/ruby
system("convert","+append","usagi.gif","usagi2.gif","usagi3.gif","usagi5.gif")
puts "Location: ./usagi5.gif"
puts

ブラウザで表示を確認してみてください。
連結されていますでしょうか? オプション+appendは、大きさが同じな画像を結合します。
testpage.html で、画像が変わらなかった場合は、ブラウザのリロードボタンを押してみてください。

+appendは、同時に何個でも画像を結合できます。これで、画像カウンターが作れますね。(作成例:count ~2004.Dec.21)

サムネイル画像を作ってみましょう。-sample オプションもありますが、下記のように明るさやシャープネスを微調整することもできます。

#!/usr/local/bin/ruby
geo = "160x160" # 縮小サイズ上限値(横x縦;単位はピクセル)
bright = "1.5"  # 明るさ補正
sharpen = "1x1" # シャープネス
infile  = "usagi5.gif"
outfile = "usagi6.jpg"
`convert -geometry #{ geo } -gamma #{ bright }/#{ bright }/#{ bright } -sharpen #{ sharpen } #{ infile } #{ outfile }`
puts "Location: ./#{ outfile }"
puts

これで、サムネイル式画像掲示板が作れますね。

使用上の注意:セキュリティには十分な配慮をしてください。 ファイルを置いたり、移動したり、書き換えたり、モードを変更するコマンドや、 ファイルやディレクトリを表示するコマンド等は特に外から自由に操作されないように注意してください。 任意のコマンドを実行させたり、故意にエラーを続発させることができるようなコマンドの使用は絶対に避けてください。 悪ガキサイバー傭兵にスキを見せないようにしましょう。

Tips

配列の要素を引数にすることができます。

system("convert","+append","usagi.gif","usagi2.gif","usagi3.gif","usagi5.gif")

a = ["convert","+append","usagi.gif","usagi2.gif","usagi3.gif","usagi5.gif"]
system(*a)

と書くことが可能です。ところで、

a = ["usagi.gif","usagi2.gif","usagi3.gif","usagi5.gif"]
system("convert","+append",*a)

は、可能ですが、

a = ["usagi.gif","usagi2.gif","usagi3.gif"]
system("convert","+append",*a,"usagi5.gif")

は、エラーになります。

更新日:2005年01月

© 2004-2005 S.Konno, all rights reserved. [ 質問 ] [ TOP ] [ J2J ] [ 目次 ] [<<戻る ] [ 次へ>>]