Posted by nanki
Thu, 30 Oct 2008 09:11:00 GMT
purl にGyazoモジュールを追加しました。
デフォルト環境にはロードされないので、自分でロードする必要があります。
Purl::Purl.new のあたり。
class PurlController < ApplicationController
caches_page :filter
def filter
begin
result = Purl::StackMachine.new(
params[:commands], Purl::Purl.new{|p| p.load_feature Purl::Features::Gyazo}).run
send_data(result[-2], :type => result[-1], :disposition => 'inline')
rescue => e
render :status => 500, :text => 'error'
end
end
end
コード例
/purl/(a7d96c2ff64900f507ef9c8dab99f983):gyazo:5:round:5:5:5:5:extend:5:dropshadow:to.png
:gyazo:5:round:5:5:5:5:extend:5:dropshadow:to.png)
参考:
Posted in web, tech, image processing, ruby | Tags purl, rails_plugin | no comments | no trackbacks
Posted by nanki
Thu, 23 Oct 2008 01:15:00 GMT
Rails pluginとして動く言語、purlを公開しました。
purl はクライアントサイドから柔軟な画像処理を行うために開発されました。
サムネイルの生成などを行うプラグインはいくつかありますが、そのどれよりも強力で汎用性、拡張性があります。
セットアップ
Rails2.1以上では、
$ script/plugin install git://github.com/nanki/purl.git
それ未満では、
$ git clone git://github.com/nanki/purl.git -- vendor/plugins/purl
gitが無い環境なら、githubのdownloadからファイルを落として、vendor/plugins/ に配置してください。
依存ライブラリ
- 必須: ImageMagick, rmagick
- あった方がいい: cairo, rcairo
その他
purl のデフォルトの環境では、画像の保存にデータベースを利用します。
imagesテーブルに、blob型のdataカラムを追加してください。
class Image < ActiveRecord::Base
attr_readonly :data
end
その上で、ImageController#upload などに以下のように記述します。
class ImageController < ApplicationController
def upload
Image.create(:data => params[:data].read)
end
end
さらに、config/routes.rbを書き替え、purl が実行されるようにします。
書く場所は先頭に近い方がいいと思います。
map.connect 'purl/:commands',
:controller => 'purl', :action => 'filter', :commands => /.*/
class PurlController < ApplicationController
caches_page :filter
def filter
begin
result = Purl::StackMachine.new(
params[:commands], Purl::Purl.new).run
send_data(result[-2], :type => result[-1], :disposition => 'inline')
rescue => e
render :status => 500, :text => 'error'
end
end
end
そんなこんなでセットアップは終わり。
言語
purl はURL上で記述されることを前提としています。
常にワンライナーであれ!
文法
purl は逆ポーランド記法を採用しています。
データと命令を書かれた順番にスタックマシンにプッシュしていき、命令が実行された結果がスタックマシン上につまれていきます。
命令列は最初に:で区切られ、数字としてパースできるものは数字へ、()で囲われた部分は文字列へと変換されます。
ポリシー
デフォルトで用意される全ての命令は、外部の値に依存しません。
つまり、命令列が決まれば実行結果は確定します。
このポリシーにより、全ての実行結果がキャッシュ可能になります。
サンプルコード
画像をそのまま表示
次の例では、load はスタック上に既にある数字1を消費して、ID=1のImage#dataをデータベースからロードして、スタック上にプッシュします。
to.png では、スタック上の画像データをPNG形式のバイト列に変換し、mimetypeとともにスタック上に積みます。

画像の形式を変換
次の例では、画像をGIF形式に変換しています。

画像のリサイズ
次の例では、画像を100x100にリサイズしています。
リサイズ用の命令は、何種類か用意されており、高さを一定に保つ resize.heightや、上限を指定する、resize.upto などがあります。
/purl/1:load:100:100:resize:to.png

画像の合成
次の例ではふたつの画像を合成しています。
/purl/1:load:9:load:composite:to.png

次の例では順番を入れ替えています。
/purl/1:load:9:load:swap:composite:to.png

コメント
スタックに積んだ後すぐにpopすると、単純に無視されるので、コメントとして使えます。
キャッシュのライフサイクルコントロールなどに使えると思います。
/purl/1:load:(daily):pop:to.png
図形の描画
詳しくは解説しませんが、試験的にcairoの描画機能をベースにした図形描画命令を用意しています。
ctx命令で、指定したサイズのcairoコンテキストを準備し、xtc命令で実際にサーフェースへの描画を実行します。
/purl/80:80:ctx:40:40:moveto:40:40:40:-20:20:arc.ccw:1:0.3:0:rgb:fill:60:20:4:circle:0:0:0:rgb:fill:xtc:to.png

制限
実行結果をファイルとしてキャッシュする場合、ファイルシステムによる字数制限を受けます。
拡張
拡張は命令モジュールの追加という形で行います。
詳しくはソースコード見てください。
今後
- 無名関数的なもの。
- 外部から直接呼び出せない命令とか?
- エラーメッセージとか?
参考:
Posted in web, tech, image processing, ruby, javascript | Tags purl, rails, rails_plugin, ruby | no comments | 1 trackback
Posted by nanki
Sat, 23 Feb 2008 12:47:00 GMT

:区切りの逆ポーランド記法言語、purlのランタイムを公開。
http://purl.netswitch.jp/purl/1:load:3:shadow:medium:to.png
上の画像のURLがそのままソースコードになっています。
こちらから画像をアップロードすると、統合開発環境に飛びます。
こんなかんじ
→

といったことが、URLだけで実現可能。
Posted in web, tech, image processing, javascript | Tags purl, ruby | no comments | no trackbacks
Posted by nanki
Wed, 20 Feb 2008 16:40:00 GMT
言語処理系を実装するのは、初めて(だと思う)
PostScript などと同じ逆ポーランド風の言語で、画像処理用途。
以下purlのソース。
2:load:dup:2:shadow:swap:composite:geom:1:load:100:100:4:pull:4:pull:crop:swap:composite:to.png
:がリテラルの区切り、その他は数字と演算子。
上のコードでは、2番の画像をロードして、ドロップシャドウしたものに1番の画像を背景として合成している。
ソースコード中に改行は入れられない。何故ならコードはURLの一部だから…

Posted in web, noise, tech, life, image processing, ruby | Tags purl, ruby | no comments | no trackbacks