バイナリで送って、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