ネットワーク経由で画像の送信してみる。
経緯としては、
今、画像用のAPIを開発しようとしていて、
ネットワーク経由で画像データをどうやって渡そう。ってとこからはじまりました。
作業自体はシンプルですが、一応自分用に書き留めておくことにしました。
使用する言語は表題通りRMagickです。
RMagick Reference
http://studio.imagemagick.org/RMagick/doc/
ネットワークはHTTP/HTTPSでの送信になります。
流れとしては以下な感じです。
①[Client] 画像データ取得&加工
②[Client] 画像データ送信
③[Server] 画像データ受信
④[Server] 画像データ解析&保存
検証
①【[Client] 画像データ取得&加工】
Railsコンソールで試しているのでデフォルトで入っているrails.pngを使用します。
1 2 3 4 |
<textarea class="ruby" cols="60" rows="5" name="code"> ./script/console >> file = File.open("images/public/rails.png") </textarea> |
②【[Client] 画像データ送信】
次にhttpで送信してみます。
そのまま上記のコンソール上でhttpで送信します。
open-uriを使えば楽チンです。
試しにパラメーター「?image=」にいれてみます。
ただ、readデータそのままだと文字化け引き起こして送信できないので
Base64変換する必要がある。さらにBase64だと”+”や”/”が問題を起こす事もあるので
さらに URI.escapeをしてあげる。
Base64変換 → URI.escapse
1 2 3 4 5 6 7 8 |
<textarea class="ruby" cols="60" rows="5" name="code"> >> file = File.open("images/public/rails.png") >> file = Base64.encode64(file.read) >> file = URI.escape(file) >> >> require "open-uri" >> open "http://192.168.1.1:3000/?image=" + file </textarea> |
※HTTP圧縮
実際に送信する時は、httpクライアントにヘッダーで圧縮アルゴリズムを使用してサイズを縮小する必要があります。
ほとんどのWEBブラウザでは自動的に付加するが、プログラムクライアントではされていない。
HTTP圧縮用ヘッダー
Accept-Encoding: gzip,compress
③【[Server] 画像データ受信】 & 【[Server] 画像データ解析&保存】
サーバー側ではimageパラメーターで渡されてきたデータを取得&解析します。
基本的には、送信時の逆の流れを行えばいいので、
URI.decode >> Base64.decode64(params[:image])
という事になります。
解析したファイルにリサイズなどの処理を加えたいので、そのままRMagickに渡します。
基本的な流れ。
1 2 3 4 5 6 7 8 |
<textarea class="ruby" cols="60" rows="5" name="code"> image = params[:image] image = URI.decode(image) image = Base64.decode64(image) rmagick = Magick::ImageList.new rmagick.from_blob(image) rmagick.write("public/images") </textarea> |
あとは上記にリサイズなどの処理を追加すればよいのかなと。