バイナリで送って、javascriptでbase64でencode、、、とか最初は考えたけど、探したらhttp://qiita.com/haruboh/items/b90fcf763295b56b0915を見つけられたので、そのままやった。
まぁ、よくよく考えてみれば当たり前。転送量だってそんなにたいした画像を書くわけでもないので、気にするほどでもなかった。
なお、元記事にある改行コードの削除は、strict_encode64メソッドでエンコードすればOK。
だいたいこんな感じ。
画像作成はgnuplot(と、ruby_gnuplot)を利用。 set output を指定しなければ、ruby変数に処理結果を格納できる。
require 'base64'
require 'gnuplot'
get '/plot' do
img = Gnuplot.open do |gp|
# 適当なpng作成処理
end
base64 = Base64.strict_encode64(img)
"<img src='data:image/png;base64,#{base64}'>"
end
で、よくよく確かめたら、今どきのgnuplotは set ternminal svg でsvgをそのまま吐けるので、エンコードとかややこしいことを考えずとも、そのままHTMLにはればよかった。
これだと、gnuplotの日本語fontなど色々ケアしなくてもよいので楽だった。(IE8,9対策に、pngでも描画できないとだめだけども、、、。)
require 'base64'
require 'gnuplot'
get '/plot' do
img = Gnuplot.open do |gp|
# 適当なsvg作成処理
end
img # svgは普通のXML文字列なので、そのままでOK
end