画像を読む 01

画像データをmacOSのスピーチ機能で読むプログラムを書いています。WindowsでもLiveCodeを使ってほとんど同じ開発ができるでしょう(確認はしません)。数ヶ月前に始めて、しばらく他のことに集中しなくてはいけなくなって中断していました。先日またプロジェクトを再開しようと思ったら、いろいろな箇所が頭の中で繋がらなくなって、もう一度始めから組み立てることにします。またこんなことがあった時のことを考えて、または誰かの参考になるかもしれないので、少し詳しく書き残します。使っているプログラム言語はLiveCodeです。基本的な扱いはわかっているものとして書き進みます。LiveCodeの基礎は「LiveCode 6 初心者開発入門」。言語はほぼ同じですが、操作ツールが現在と少し変わっています。



ドラッグ&ドロップ

始めにイメージ・ファイルを、ドラッグ&ドロップでカード上にあるイメージ・オブジェクトに表示させます。ついでにテキスト・ファイルのドラッグ&ドロップも書いて行くことにします。イメージ&テキスト・オブジェクトはロケーションをロックしておきます。イメージはロックしておかないと、ファイルのオリジナルサイズに表示されてします。オブジェクトの大きさは適当で良いです。イメージは常にウインドウの2分の1幅になるよう、調整のスクリプトを書きます。

カード上に作ったイメージ・オブジェクトに「dropImage」テキスト・フィールドに「dropFld」と名前をつけます。今は特に名前は重要ではありません。

まずカードに書くスクリプト

on dragEnter
  set the acceptDrop to true
end dragEnter

これでドラッグした時にプログラムが反応します

その下に書くスクリプト

on dragDrop
  put dragData["files"] into tPath
  put tPath &cr& the target
end dragDrop

例 tPath:/Users/kenjikojima/Desktop/foxtails.png 例 the target: image id 1003

このスクリプトでイメージ・ファイル、テキスト・ファイルを、カード上のオブジェクトにドラッグ&ドロップすることで、ドロップしたファイルのパス「tPath」と、ドロップしたオブジェクトの名前「the target」を得ることができます。これによってターゲットにしたイメージ・オブジェクトに、ファイル・パスをセットすればイメージが、テクスト・フィールドには、ドロップしたファイルのテキストを表示できます。

ここでは使いませんが、もう一つ書き加えると「dragData["files"]」はアレイ(配列)ですから、複数のファイルをターゲットにドロップした場合、return をデリミッターとして並んだ行のファイル・パスが得られます。

カードに書くスクリプト dragDrop 続き 1

on dragDrop
  put dragData["files"] into tPath
  if word 1 of the target is not "image" then 
      beep
      exit to top
  end if
end dragDrop

ターゲットがイメージ・オブジェクトでなかった場合 dragDropハンドラーからビープオンを鳴らして抜けます。

カードに書くスクリプト dragDrop 続き 2
イメージ・オブジェクトが「dropImage」の場合

on dragDrop
  put dragData["files"] into tPath
  if word 1 of the target is not "image" then 
      beep
      exit to top
  end if
  set the filename of the target to ("file://" & tPath)
end dragDrop

これでファイルはイメージ・オブジェクトにセットできますが、オリジナル・イメージの持っている左右天地の比率に整える必要があります。ここではイメージ・オブジェクトの幅は、ウインドウ・サイズの2分の1にします。イメージのオリジナルの左右、天地は「the formattedwidth of image "イメージ名"」と「the formattedheight of image "イメージ名"」で得ることができますから、ウインドウ・サイズの2分の1幅でその比例を保つように計算します。イメージ・オブジェクトの位置は、左上のポイントが基準で左右・天地が決まります。

次にもうひとつ条件を「ターゲットがフィールド」と「ファイルパスがテキスト・ファイル」にして、フィールドに文章を入れます。

on dragDrop
   put dragData["files"] into tPath
   if word 1 of the target is "image" and char -4 to -1 of tPath is ".jpg" then 
      set the filename of the target to ("file://"&tPath)
      set the width of image "dropImage" to the width of this cd / 2
      set the height of image "dropImage" to \
            (the formattedheight of image "dropImage" * the width of this cd / 2) \
            / the formattedwidth of image "dropImage" 
   else
   -- もうひとつ条件「ターゲットがフィールド」と「ファイルパスがテキスト・ファイル」
      if word 1 of the target is "field" and char -4 to -1 of tPath is ".txt" then
         put textdecode(url ("binfile:/" & tPath), "utf-8") into the target
      end if
   end if
end dragDrop

基本的にはこれで良いのですが、イメージ・ファイルが「jpg」でなく「png」の時や、テキスト・フィールドにイメージ・ファイルをドロップした場合や、イメージ・オブジェクトにテキスト・ファイルをドロップした場合も書いておく必要があります。

ターゲットがイメージ・オブジェクトでファイルが「jpg」で条件を作りましたが、もう一つ「png」という場合も考えておきます。

if word 1 of the target is "image" and char -4 to -1 of tPath is ".png" then

条件文は「.jpg」を「.png」に変えるだけで、イメージ・ファイルをイメージ・オブジェクトにセットする分は全く同じものを使うことになりますから、その部分は「setImage」というプライベート・コマンドを作ることにします。プライベート・コマンドは、同じオブジェクトの中だけで使われるコマンドで、幾つものオブジェクトで使われるコマンドより早い処理ができます。

private command setImage pPath
   set the filename of the target to ("file://"& pPath)
   set the width of image "dropImage" to the width of this cd / 2
   set the height of image "dropImage" to \
         (the formattedheight of image "dropImage" * the width of this cd / 2) \
         / the formattedwidth of image "dropImage" 
end setImage

ハンドラー「dragDrop」は以下のようになります。

on dragDrop
   put dragData["files"] into tPath
   -- イメージ・ファイル .png 
   if word 1 of the target is "image" and char -4 to -1 of tPath is ".png" then 
      setImage tPath
   else
     -- イメージ・ファイル .jpg 
      if word 1 of the target is "image" and char -4 to -1 of tPath is ".jpg" then 
         setImage tPath
      else
      -- テキスト・ファイル .txt
         if word 1 of the target is "field" and char -4 to -1 of tPath is ".txt" then
         -- テキストはバイナリー・データを、utf-8(ユニコード)にしてフィールドに入れます
            put textdecode(url ("binfile:/" & tPath), "utf-8") into the target
         else
         -- それ以外で条件の外れるものは全てビープ音を鳴らす
            beep
            exit to top
         end if
      end if
   end if
end dragDrop


カード内に書き込む全てのスクリプトは以下の通りです。

on dragEnter
   set the acceptDrop to true
end dragEnter

on dragDrop
   put dragData["files"] into tPath
   if word 1 of the target is "image" and char -4 to -1 of tPath is ".png" then 
      setImage tPath
   else
      if word 1 of the target is "image" and char -4 to -1 of tPath is ".jpg" then 
         setImage tPath
      else
         if word 1 of the target is "field" and char -4 to -1 of tPath is ".txt" then
            put textdecode(url ("binfile:/" & tPath), "utf-8") into the target
         else
            beep
            exit to top
         end if
      end if
   end if
end dragDrop

private command setImage pPath
   set the filename of the target to ("file://"&pPath)
   set the width of image "dropImage" to the width of this cd / 2
   set the height of image "dropImage" to \
         (the formattedheight of image "dropImage" * the width of this cd / 2) \
         / the formattedwidth of image "dropImage" 
end setImage




モザイク




アーチスト:小島健治 / Artist: Kenji Kojima

アーチスト:小島健治
kenjikojima.com


クリエイティブ・コモンズ
Attribution-NonCommercial-NoDerivatives

Click and Go to PayPal

日本からのドネーションは こちらをクリック
LiveCode 6 初心者開発入門