2011-03-23 6 views
11

私はこの問題にかなり悩まされています。ルビーを使ってキャンバスをイメージに変換して開き、新しいウィンドウで開きます。

私が達成しようとしているのは、toDataURLを使用してキャンバスを画像に変換するリンク、ボタン、または画像をクリックすることです。その後、このイメージを含む新しいウィンドウが開きます。

ruby​​ on railsを使用してtoDataURLから生成されたデータURLを新しいウィンドウに渡すにはどうすればよいですか?

ありがとうございます。

答えて

21

まず、これはRailsとあまり関係ありません。しかし、Rubyを使ってこの問題に取り組むことができます。あなたはすでにやっているよう

まず、キャンバスの内容をフェッチ:

をこの時点で、あなたは、単にJavaScriptで新しいウィンドウを開き、まっすぐそこに画像を開くことができます(ないサーバーとの対話は必要ありません) :http://jsfiddle.net/XtUFt/

それとも、サーバAへの純粋なbase64文字列を送信することができます:

var window = window.open(); 
window.document.write('<img src="'+dataURL+'"/>'); 

$('a.my-link').click(function(){ 
    open().document.write('<img src="'+dataURL+'"/>'); 
    return false; 
}); 

はここでこれを説明するための小さなフィドルですNDあなたのアプリは、実際の画像を作成し、それをレンダリングするためにビューを使用してあります!

var base64 = dataURL.replace(/^data:image\/(png|jpg);base64,/, "") ; 
var window = window.open('http://www.yourapp.com/controller/action?base64='+base64); 

これは単純化した例であり、非常に小さな画像を想定しています。あなたのイメージがどんなに大きい場合でも、文字列が長すぎるため、URLにデータが格納されないため、 '投稿'リクエストを使用する必要があります。

そして、あなたはそれからイメージを作成するために使用することができ、サーバー上:

require 'base64' 
File.open('your/image/path/and/name.gif', 'wb') do|f| 
    f.write(Base64.decode64(params[:base64])) 
end 

そして、それは、画像を開いて、それに応じてビューをレンダリングするだけの問題です。

+0

迅速な返信polarblauありがとうございます。 しかし、なぜ以前の記事で提案されている次の方法では、ページがまだロード中であることを示すアイコンが表示されるウィンドウが開きますか? var window = window.open(); window.document.write( "image tag with src = dataURL"); 私の主な目的は、キャンバスに表示されているグラフを画像として保存できるようにすることです。 別のウィンドウに表示されている選択したグラフの画像を見た後、ユーザーは画像を右クリックして保存することができます。 だから私は上記の方法で十分だと思います。 私が間違っている場合は、私を修正してください。 ありがとうございます。 – Mich

+0

リンクが何をすることができるかの例を追加しました。仕事をしているようだ。しかし、あなたは正しいです。ローディングアイコンは消えません。 'window.open'関数が取るパラメータを指定し、それが役立つかどうかを調べることができます。 – polarblau

+1

すぐに返事ありがとうございましたpolarblau。多くのgoogle-ingの後、私はwindow.document.close()を使用しなければならないことを知りました。新しいウィンドウに書き込んだ後で、ウィンドウへの書き込みを停止したことを示します。 close()関数を追加した後、画像が表示されると、読み込みアイコンが消えてしまいました。 – Mich

1

私は遅く、このためだが、ここでこの質問を解決して1つの迅速な汚いライナーです:

window.open(document.getElementById("mycanvas").toDataURL()); 

が、これは近い将来に誰かに役立ちます願っています。

1

私のアプローチ:

var dataURL = canvas.toDataURL("image/png"); 
var newTab = window.open(dataURL, 'Image'); 
newTab.focus(); 

それが将来的に誰かに役立ちますように。

関連する問題