RMagick で画像に Wet floor effect を適用する

せっかく上の記事で勉強したので、Web アプリケーション化しました。名前はベタに「Reflectr」としておきます。

Reflectr

画像をアップロードすると、Wet floor effect を適用してくれます。床の色も指定できるようにしました。

アプリケーションは Ruby on Rails で、DreamHostにホスティングしています。作るのはそんなに苦労してませんが、DreamHost で動かすのに苦労しました。そのあたりは追々書きます。

ちなみに、ロゴはここで作ってみました。

Wet floor effect – Wikipedia, the free encyclopedia

画像や文字が床に反射しているようなエフェクトは Wet floor effect と呼ばれるらしい。確かにぬれた床っぽい。Wikipedia によると、Apple が初めにメジャにしたらしい。

僕もいろんな画像をぬれた床に映してやりたいのですが、Photoshop を使うほどのことじゃないし、そもそも Photoshop 入ってません。そこで我らが RMagick の出番です。

RMagick は ImageMagick の Ruby 用インタフェースで、ImageMagick がインストールされている環境なら gem でゴリっとインストールできます。

$ sudo gem install rmagick

RMagick のドキュメントを見ると、RMagick 1.15.0 以降には wet_floor というそのまんまのメソッドが用意されています。早速使ってみました。

まずは元となる画像を用意。パブリックドメインの画像を探してきました。
Original

では、やってみます。

$ irb
>> gem 'rmagick'
=> true
>> require 'RMagick'
=> true
>> include Magick
=> Object
>> originals = ImageList.new('original.png')  # 元画像から ImageList オブジェクト生成
=> [originalpng PNG 176x240 176x24000 DirectClass 8-bit 88kb]
scene0
>> reflection = originals.first.wet_floor  # wet_floor を呼ぶ
=> originalpng PNG 176x240=>176x80 176x24000 DirectClass 8-bit 88kb
>> reflection.write('reflection.png')  # wet_floor の結果をファイルに書き出す
=> originalpng=>reflectionpng PNG 176x240=>176x80 176x24000 DirectClass 8-bit 35kb

こんな感じで、wet_floor の結果を reflection.png に書き出してみます。
Reflection
wet_floor で生成される Image オブジェクトは映り込みの部分だけなので、実際に使う場合には元の画像とくっつけて出力する必要があります。

>> results = ImageList.new
=> []
scene
>> results << originals.first < [originalpng PNG 176x240 176x24000 DirectClass 8-bit 88kb
originalpng=>reflectionpng PNG 176x240=>176x80 176x800240 DirectClass 8-bit 88kb]
scene1
>> result = results.append(true)
=> originalpng PNG 176x240=>176x320 176x32000 DirectClass 8-bit 88kb
>> result.write('result.png')
=> originalpng=>resultpng PNG 176x240=>176x320 176x32000 DirectClass 8-bit 137kb

result.png はこうなります。
Result

以上で完成。今回試した限りでは JPEG ではまったく透明になりませんでした。環境の問題かもしれませんが、そのような場合でも一度 PNG などに変換してから処理すればよいと思います。

au の FMC 戦略のキモとなりそうな au one がスタートしました。なかでも、「100 年使えるメールアドレス」とうたう Gmail ベースの au one メールは注目を集めています。

初日ということで今朝アクセスした時点ではサーバがパンク状態。まともに表示できませんでした。とりあえずメールアドレスだけでもと思い、ケータイからメールアドレスを申請。希望のアカウントを入力したら、確認画面もなく取得出来てしまうので、よく考えてから入力した方がいい。

au one メールの画面ですが、Gmail/Gmailモバイルをベースにしており、ほとんどそのままです。今のところ、絵文字も表示できないし、ezweb メールが自動転送されるわけでもない、単なる機能制限された Gmail です。例えば、通常の Gmail には POP3 アクセス可能ですが、au one メールはできません。

今後、絵文字対応や ezweb メール自動転送が追加される予定ですが、そうなったとして、メール保存箱以外のどんな使い方ができるんだろう。まだよくわからない。

Vim に TextMate 的なコードスニペット挿入機能を追加してくれる snippetsEmu はとても便利なのですが、気付けばいつの間にやら動作しなくなっていました。

先日 Vim の本を買って .vimrc を色々といじり回していたので、何か相性の悪い設定でもしてしまったんだろうと思い、設定値をひとつずつ無効にして確認してみました。すると、どうやら :set paste が邪魔をしているようで、コメントアウトするとスニペットを挿入できます。

:set paste は Vim に文字列をペーストするさいにインデントを無効にしてペーストするというオプションです。:set paste せずに(つまり :set nopaste して)インデント済みのソースコードをペーストすると、ペーストされた文字列を Vim がさらにインデントしてしまうので、インデントが二重に行われてしまいます。

:set paste した状態ではスニペットを挿入できなかったので、.vimrc から :set paste を削除しました。常に :set paste しておく必要はないので、今後はペーストするときに手動で :set paste を実行して、ペースト後は :set nopaste を実行することにします。

photo

ViIMproved‐Vim完全バイブル
Steve Oualline 高橋 則利
技術評論社 2004-05

by G-Tools , 2007/09/23

ファイルのアップロード機能を作っていて、テストの書き方がわからなかったので調べた結果をメモ。アップロード処理は次のようになっています。

  1. ブラウザがファイルを Post
  2. コントローラが Post データを受け取り、モデルに渡す
  3. モデルがデータをファイルに保存

行いたいテストはコントローラのテストとモデルのテストの2種類。

まずコントローラのテスト。ActionController::TestUploadedFileを使う模様。
83’s : ファイルアップロードのテスト

次にモデルのテスト。

ファイルがアップロードされたかテストするためには、cgi.rbがマルチパートのPOSTを受け取ったときの処理を模擬する必要がある。 困ったことに、そこでやることは結構長くて複雑だ。 ファイルをシステムに取り込んで、いつもcgi.rbから取り出している形式に変換する。 もちろんどんなメソッドを持つかは場合による。

定義 (test_helper.rb):

def uploaded_file(tmp_filename, content_type, filename)
t = Tempfile.new(filename);
t.binmode
path = RAILS_ROOT + “/test/fixtures/files/” + tmp_filename
FileUtils.copy_file(path, t.path)
(class << t; self; end).class_eval do alias local_path path define_method(:original_filename) { filename } define_method(:content_type) { content_type } end return t end [/sourcecode] RoR Wiki 翻訳 Wiki – HowtoUploadFiles より

通常、Post データがモデルに渡るときには TempFile クラスのオブジェクトで渡され、しかもオブジェクトは cgi.rb によて拡張されているんだと思います。そのため、データを保存するモデルをテストするには、cgi.rb と同様の拡張をほどこしてくれるヘルパ関数を test_helper.rb に定義しています。

以上でコントローラ、モデルともにテストできます。

たまにこっそりブログパーツを追加していますが、サイトストック
ブログの価値を計算して表示してくれるブログパーツが話題になっていたので、ページ最下部に追加してみました。15000円とちょっとという、やけにリアルな金額。

この査定額があがるようなブログにしたいな。