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

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

カメラ撮影画像を表示する

ファイル名一覧を取得する関数を用いて、カメラ撮影画像ファイルを読み込むサンプルプログラムを作ってみました。
canvas.putg()の座標やサイズを変更すると、サムネイルとして並べることや、大きな画像をスクロールして表示させることも可能です。

------------------------------------------
--ファイル名を取得するサンプル
--スクロール表示サンプルも付いてます
------------------------------------------
--関数宣言--------------------------------
main={}          --mainメソッド
split={}         --文字の分解
getFilename={}   --ファイル名読み込みます
printscrl={}     --スクロールするテキスト表示

--グローバル変数宣言----------------------
Filename={}      --ファイル名取得用配列

LuaPath="/sdcard/luarida/getfilenamesample/"  --luaファイルを保存しているPath
CameraFolder="/sdcard/DCIM/Camera"            --写真データのフォルダ
------------------------------------------
mt={}
mt.__newindex=function(mtt,mtn,mtv)
  dialog( "Error Message", "宣言していない変数 "..mtn.." に値を入れようとしています", 0 )
  toast("画面タッチで実行を続けます", 1)
  touch(3)
end
mt.__index=function(mtt,mtn)
  dialog( "Error Message", "変数 "..mtn.." は宣言されていません", 0 )
  toast("画面タッチで実行を続けます", 1)
  touch(3)
end
setmetatable(_G,mt)
--------以下が実プログラム----------------
------------------------------------------
--スクロールするテキスト表示
------------------------------------------
function printscrl( str, fontsize, fcolor, bcolor )
local w,h = canvas.getviewSize()
local sc
  --一度、見えないところにテキストを書いて、改行数を求める
  sc = canvas.drawTextBox( str, 0, h+1, fontsize, fcolor, w )
  --画面の絵をワークエリアに取り込みます
  canvas.getg( 0, fontsize*sc, w-1, h-1, 0, fontsize*sc, w-1, h-1 )
  --取り込んだ画面をスクロールさせて描きます
  canvas.putg( 0, 0, w-1, h-fontsize*sc-1, 0, fontsize*sc, w-1, h-1 )
  --書き出す部分をバックカラーで塗り潰します
  canvas.drawRect(  0, h-fontsize*sc-1, w, h, bcolor, 1 )
  --フラッシュします
  canvas.putflush()
  --スクロールしたところにテキストを書きます
  canvas.drawTextBox( str, 0, h-fontsize*sc, fontsize, fcolor, w )
end
------------------------------------------
--文字の分解
------------------------------------------
function split(str, d)
local s = str
local t = {}
local p = "%s*(.-)%s*"..d.."%s*"
local f = function(v)  table.insert(t, v)  end

  if s ~= nil then
    string.gsub(s, p, f)
    f(string.gsub(s, p, ""))
  end
  return t
end
------------------------------------------
--ファイル名を読み込みます
--ファイル名を取得したテーブルが返ります
------------------------------------------
function getFilename( folder )
local fp
local msg
local str
local t={}
local i = 1
local tmpFile = LuaPath.."files.tmp"  --ファイル名を書き出すテンポラリファイル
local fname={}
  --os.execute()を用いて、ls -l を行い、フォルダ内容をファイルに書き出す。
  os.execute( "ls -l '"..folder.."' > "..tmpFile )
  --ファイルを開きます
  fp,msg = io.open( tmpFile, "r")
  if( not(fp) )then
    dialog( tmpFile.."がオープンできません","プログラムを終了します", 0 )
    return
  end
  --データを読み込みます
  while(true)do
    str = fp:read("*l")                --1行読み込み
    if( str==nil )then break end       --読込むデータが無ければ終了
    str = string.gsub( str,"\r","" )   --改行コードを外す
    --dで始まっているものはフォルダなので無視する
    if( string.sub( str, 1, 1 )~="d" )then
      t = split( str, ":" )            --コロンで分ける。
      --ファイルのみを抽出します
      fname[i] = string.sub( t[2], 4 ) --t[2]の4文字目以降がファイル名
      i = i + 1
    end
  end
  io.close(fp)
  return fname  --ファイル名テーブルを返す
end
------------------------------------------
--メインプログラム
------------------------------------------
function main()
local i
local n

  --画面を白色にする
  canvas.drawCls( color(255,255,255) )
  --/sdcard/DCIM/Cameraにあるファイル名を取得する
  Filename = getFilename( CameraFolder )
  n = #Filename

  printscrl( CameraFolder.." にあるファイル一覧", 18, color(0,0,0), color(255,255,255) )
  for i=1,n do
    printscrl( Filename[i], 18, color(0,0,0), color(255,255,255) )
  end
  
  --画像を読み込んで画面に表示します
  for i=1,n do
    --ワークエリア画面をクリアします
    canvas.workCls()
    if( string.upper(string.sub(Filename[i],-3))=="JPG" )then
      --jpgファイルのみを抽出する
      if( canvas.loadBmp( CameraFolder.."/"..Filename[i], 0, 0, 1023, 795 )==-1 )then
        dialog( CameraFolder.."/"..Filename[i], "ロードに失敗しました",1 )
        do return end
      end
      --ワークエリアから画面に持ってくる
      canvas.putg( 0, 0, 480, 300, 0, 0, 1023, 795 )
      canvas.putflush()  --画面更新
      --影付きでファイル名を表示する
      canvas.drawText( Filename[i], 1, 1, 20, color(0,0,0) )    
      canvas.drawText( Filename[i], 0, 0, 20, color(255,255,255) )    
      toast( "画面タッチで次の画像表示", 0 )
      touch(3)
    end
  end
end
main()