今野 滋
カウンターやサムネイル式画像掲示板を作るためには、画像を自動で加工できなければなりません。Ruby 自体には画像加工の機能はありませんが、私たちのサーバーにはImageMagickがインストールされているので、これを使うことができます。
ImageMagickの使い方はマニュアルを見れば良いのですが、英語です。コマンドの説明を、日本人向けに簡潔にまとめたページがありますので、そちらが参考になると思います。これはWindows版の解説ですが、UNIX版と、ほぼ共通です。
http://hashi4.civil.tohoku.ac.jp/soft/node43.html © Takashi CHIBA
試しにテスト用画像の上下をひっくり返してみましょう。
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は、同時に何個でも画像を結合できます。これで、画像カウンターが作れますね。(作成例: ~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
これで、サムネイル式画像掲示板が作れますね。
使用上の注意:セキュリティには十分な配慮をしてください。 ファイルを置いたり、移動したり、書き換えたり、モードを変更するコマンドや、 ファイルやディレクトリを表示するコマンド等は特に外から自由に操作されないように注意してください。 任意のコマンドを実行させたり、故意にエラーを続発させることができるようなコマンドの使用は絶対に避けてください。 悪ガキやサイバー傭兵にスキを見せないようにしましょう。
配列の要素を引数にすることができます。
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月