コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

インターネットから画像を取得

http.getコマンドを実装したので、Luaridaでインターネットから画像を取得するサンプルを書いてみたいと思います。せっかくなので、定期的に画像を取得して順次切り替えて表示するようなプログラムを作って見たいと思います。

画像取得サンプル

関数の宣言とグローバル変数宣言は下記のような感じです。

------------------------------------------
--画像取得サンプル
------------------------------------------
--関数宣言--------------------------------
main={}			--mainメソッド
initPicture={}		--ワークエリアに画像を読み込みます
getNextTime={}		--今の時間から次の時分を求めます
jiwajiwaDisp={}		--画像をじわじわ表示する
getPicture={}		--指定時刻の画像を読み込む
--グローバル変数宣言----------------------
Wid, Hei = canvas.getviewSize()	--端末の画面サイズ
PicName = "/picture.jpg"
LuaridaPath="/sdcard/luarida"	--luaファイルを保存しているPath

メインプログラム

最初にワーク画面とメイン画面のサイズを設定します。ワーク画面サイズを小さくしてメモリ消費を抑えたかったのが目的です。
getPicture()でインターネットから画像を読み込んでいます。画像はPicName変数のファイル名で保存されます。今回取り込む画像は1分後とに異なる画像を取得することができるサイトなので、時分を指定して取り込みます。httpの取得は非同期に動いているので、forループで少し待ちます。CPUの速いマシンは10000くらいのループでは一瞬に終了し、最初の画像が表示されない恐れがあります。値を大きくするかbreakで抜ける無限ループにしてください。
画像の取り込みに成功したならば、それをワーク画面に読み込んだ後、じわじわ画面に表示します。

------------------------------------------
--メインプログラム
------------------------------------------
function main()
local i
local sta
 --メイン画面サイズを設定する
 canvas.setMainBmp( Wid, Hei )	--メイン画面のサイズ設定
 canvas.setWorkBmp( Wid, Hei )	--ワークエリアも一緒のサイズにする

 --画面を白くする
 canvas.drawCls( color(255,255,255) )

 --今の時刻の画像を読み込む
 getPicture( os.date("%H%M") )

 --少し待つ
 for i=0,10000 do
   sta = http.status()
   if( sta~=0 )then break end
 end

 if( sta==1 )then
   --読み込み成功
   if( initPicture()==0 )then
     jiwajiwaDisp()		--画像をじわじわ表示する
   end
 end
 --読み込みに失敗したら諦める

 local tmg = os.date("%H%M")	--今の時間を取得する
 sta = 2

 while( true )do
   if( sta>1 )then getPicture( getNextTime() ) end   --次の画像を取得する

   sta = http.status()	--http取得statusを読み込む(読み込み中=0,正常終了=1)

   if( tmg~=os.date("%H%M") )then
     --時間が変ったときは画像を切り替える
     if( initPicture()==0 )then
       jiwajiwaDisp()		--画像をじわじわ表示する
       tmg = os.date("%H%M")	--今の時間を再設定する
       sta = 2
     end
   end
   local x,y,s = touch()
   if( s~=1 )then break end
 end
end
main()

後半のwhileループは、1分毎に画像を切り替える無限ループです。今の時分を覚えておき、その値が変化したら1分経ったと判断して、画像をじわじわ切り替えます。分が変るときに画像を変えたいので、1分先の画像を先読みしています。先読みの条件にhttp.status()の値を使っています。statusは読み込み中は0、正常終了は1なので、statusの値が2以上の時に画像を先読みします。読み込み中は0となるので、何回も読み込みには行きません。そして、読み込みに失敗すると2以上の値を取るので、再度、読み込みに挑戦します。
時間が変化した場合は、if( tmg~=os.date("%H%M") )thenによりチェックして、画像をじわじわ表示させた後、staを2として、画像の先読みをさせます。
また、touch()により画面タッチを取得しており、画面タッチが発生するとプログラムが終了します。

今の時間から次の時分を求めます

何の変哲も無いプログラムです。きっともっといいプログラムがあるはずです。

------------------------------------------
--今の時間から次の時分を求めます
------------------------------------------
function getNextTime()
local hm = os.date("%H%M")
local h = tonumber(string.sub( hm, 1, 2 ))
local m = tonumber(string.sub( hm, 3, 4 ))
local tm = ""
 m = m + 1
 if( m>59 )then
   m = 0
   h = h + 1
   if( h>59 )then h = 0 end
 end
 if( h<10 )then tm = "0"..tostring(h) else tm = tostring(h) end
 if( m<10 )then tm = tm.."0"..tostring(m) else tm = tm..tostring(m) end
 return tm
end

指定時刻の画像を読み込む

指定時刻の画像を読むプログラムです。http.getを起動しています。非同期に取得するので、プログラムの実行は先に進みます。

------------------------------------------
--指定時刻の画像を読み込む
------------------------------------------
function getPicture( tm )
local url = "http://www.bijint.com/jp/img/clk/"..tm..".jpg"

 http.addHeader( "Referer" , "http://www.bijint.com/" )
 http.get( url, LuaridaPath..PicName )
end

ワークエリアに画像を読み込みます

canvas.loadBmp()コマンドを用いて、画像をワーク画面に読み込みます。正しく読み込めたときは0が返ります。

------------------------------------------
-- ワークエリアに画像を読み込みます
------------------------------------------
function initPicture()
local filename
 --ワークエリア画面をクリアします
 canvas.workCls()
 filename = LuaridaPath..PicName
 if( canvas.loadBmp( filename, 0, 0, Wid-1, Hei-1 )==-1)then return -1 end
 return 0
end

画像をじわじわ表示する

画像をじわじわ表示するプログラムです。color()コマンドは、4番目の引数に透過値を指定できるので、まず、じわじわ白くなるように、画面にcolor(255,255,255,i)を上書きします。
そして、じわじわ画像がでるように、画像をputg()した上にじわじわと透過するように、color(255,255,255,i)を描いていきます。これで、ホワイトアウト、ホワイトインの効果を表示できます。CPUの処理速度差を出したくない場合は、system.sec()を用いてus精度の時間取得を行い、フレームレートを一定にする必要がありますが、今回手を抜きました。

------------------------------------------
--画像をじわじわ表示する
------------------------------------------
function jiwajiwaDisp()
local i
 for i=0,255,8 do
   canvas.drawCls( color(255,255,255,i) )
 end
 for i=255,0,-8 do
   canvas.putg( 0,0,Wid-1,Hei-1, 0,0,Wid-1,Hei-1 )
   canvas.drawCls( color(255,255,255,i) )
 end
 canvas.putg( 0,0,Wid-1,Hei-1, 0,0,Wid-1,Hei-1 )
 canvas.putflush()
end

以上、インターネットから画像を取得するサンプルを作ってみました。getPicture()を書き換えれば、いろいろな応用に使えると思います。