33
 イメージ 



既に、一般ウィジェット、ダイアログ、テキストウィジェットなどにイメージを表示する方法を簡単に解説しました(この先の章ではキャンバスでもイメージを扱います)。
このセクションでは、それらに共通するイメージデータの生成方法や、イメージの加工、イメージをファイルに出力する方法など、付加的な機能を解説します。
イメージを扱うプログラムは起動後の最初にイメージを表示する際、少し待たされます。(一般的なマシンで2秒〜数秒といったところでPCの性能も関係します) ただ、一度でもイメージ表示がおこなわれると次回からは待ちは無くなります。(OS再起動後はまた待ちが生じます)。
恐れ入りますがこの時間待ちはバグではなく、GUIエンジンの特性によるものとしてご承知をお願いします。(将来のGUIエンジンの版によって解消される可能性もありますが現在はまだ未定です)

 
 
イメージデータの生成
 
 

 本マニュアルでは「イメージ」という表現をGUIライブラリ内に格納されているイメージデータという意味で使うことがあります。たとえば「イメージが返されます」というような言い方をします。

■イメージをロード
 イメージデータを内部生成する手段として多く使われるのが、イメージファイルからのロードです。以下のような文法になります。

構文=
<ファイル名>で イメージをロード → イメージID
       プログラム例:
        イメージ1は ID

    "image\MindIcon.png"を イメージをロードし イメージ1に 入れ
 指定したイメージファイルを読み込みライブラリ内に格納します。整数のIDが返されます。以後のイメージ操作はすべてこのIDを使って行います。IDという用語を使いますがウィジェットIDではなく、ライブラリ内に存在するイメージデータを指し示すためのIDです。
 イメージIDを格納する変数はウィジェットIDと同様に 「○○は ID」 によって宣言してください。
 ビットマップデータのファイルを指定することもできます。元がビットマップであってもID化した段階で他の形式のイメージと区別はつかなくなります。(ただし「info」など標準ビットマップは別扱いです)


 
 
イメージを扱う解説の一覧
 
 

 イメージを扱うことのできるウィジェットとしては、ボタンやラベルなどの一般ウィジェットのほか、ダイアログ、テキストウィジェット、キャンバスなどがあります。
 いままでのイメージ関連の解説を以下にまとめておきます。
ラベルなどの一般ウィジェット中へのイメージ表示
   「ウィジェットの属性指定」−「属性の設定」−
        「イメージの埋め込み」
        「イメージ埋め込みの位置揃え」
        「ビットマップの埋め込み」
テキストウィジェットへのイメージ表示
   「テキストウィジェット」−「プログラムによる編集機能」−
        「イメージの表示」
キャンバスウィジェットへのイメージ表示
   「キャンバス」−「イメージの描画」−
        「図形としてイメージを描く」
        「図形としてビットマップを描く」
 上記で共通して重要なものが、少し前で解説した「イメージをロード」です。これだけはどのような場面であっても必要となります。


 
 
多くのイメージを表示するサンプル
 
 

 簡単なものとしてはサンプルプログラム "image-photo.exe" があります。
 samplew\image\ 配下にある "music.jpeg" という画像をロードし、テキストボックス内に表示します。
 多くの画像を表示するものとして、サンプルプログラム "image-photo-all.exe" があります。
 このプログラムは samplew\image\ 配下にある多くのイメージファイル(.png、 .jpeg、 .ico、 .bmp など複数種別)をロードし、テキストボックス内に表示します。


 
 
イメージの加工
 
 

■イメージの拡大

構文=
<旧イメージID>を <倍数>で イメージを拡大                       → 新イメージID
 指定したイメージを指定した倍数で拡大し、新しいイメージIDとして返します。旧イメージは影響を受けません。拡大率は整数倍のみが利用できます。
 実際の動きとしてはサンプル "image-expand.exe" をご覧ください。

■イメージの縮小

構文=
<旧イメージID>を <倍数>で イメージを縮小                       → 新イメージID
 指定したイメージを指定した倍数で縮小し、新しいイメージIDとして返します。旧イメージは影響を受けません。
 整数分の1にすることのみとなります。たとえば2を指定すると 2分の1に、 3を指定すると3分の1になります。
 実際の動きとしてはサンプル "image-expand.exe" をご覧ください。


 
 
イメージの出力
 
 

 どのようなウィジェットであっても(テキストウィジェット、キャンバスウィジェット、ウィンドウといった大掛かりなものも)、
    ”ウィジェットがウィンドウ内に表示されている状態のイメージデータ”
を取得することができます。もちろんウィンドウ自体もです。デスクトップにおけるスクリーンショットのようなものです。
 この ”スクリーンショットのようなもの” は、メモリ上のデータとしてまずは保持されます。ファイルへの出力が必要な場合はそのための処理単語を別に実行することで行うことができます。

■ウィジェットのイメージを取得

構文=
<ウィジェットID>の ウィジェットのイメージを取得 → イメージID
       プログラム例1:
        ラベル1は    ID
        ラベルイメージは ID

    ラベル1の ウィジェットのイメージを取得し ラベルイメージに 入れ
       プログラム例2:
        ウィンドウのイメージは ID

    メインウィンドウの ウィジェットのイメージを取得し
                   ウィンドウのイメージに 入れ
 指定したウィジェットのイメージを取得し、それを指すイメージIDを返します。見た目の変化はありませんが内部データとして記憶されています。
記:ウィジェットのイメージは個々のウィジェットの囲み線などが省かれ中身だけとなるため、画面で見るウィジットに比べると質素な感じがしますが、そのような仕様であるとご承知ください。(ウィンドウのイメージではタイトルバーも省かれます)

■イメージをファイルに出力

構文=
<イメージID>を   <フォーマット>と <ファイル名>で イメージをファイルに出力 → ・       フォーマットとして以下のいずれかの文字列を与える             "gif"             "jpeg"             "png"             "bmp"
       プログラム例:
        ラベルイメージは ID

    ラベル1の ウィジェットのイメージを取得し ラベルイメージに 入れ

    ラベルイメージを
        "png"と "c:\temp\image-of-label.png"で
                 イメージをファイルに出力する
 イメージIDで指定したイメージをファイルに出力します。
 出力する際のフォーマットを指定できます。
指定したファイル名の有意性検査はMindレベルでおこなっていますがその後のファイルアクセスに伴うエラー発生はMind側からは関与できないため、誤ったファイル名を与えたり、既存ファイルへの出力、出力先のフォルダがReadOnlyなどの場合、GUIエンジン(Tcl/Tk)レベルでエラーが発生することかありますが、そのような仕様であるとご承知ください。
GUIエンジンの特性上、ファイル名に空白を含んだり、ファイル名やディレクトリ名に日本語が使われていると誤動作することがあります。
 サンプルプログラム "image-get-widgetimages.exe" を実行してみてください。
 ボタンを押すと、このプログラム自身のラベル、ボタン、ウィンドウの3つについてイメージを取得し、"c:\temp" ディレクトリに次の3つのファイルを生成します。
      image-of-label.png
      image-of-button.png
      image-of-window.png

注: "image-get-widgetimages.exe" を起動する前に、 "c:\temp" というディレクトリを(もし無ければ)作成しておいてください。

■イメージのフォーマット変換への応用
 「イメージをロード」と「イメージをファイルに出力」をコンビネーションで使うことで、ウィンドウへのイメージの描画とは関係なく、アプリケーシプログラムとしてイメージファイルを別のフォーマットに変換するプログラムを作ることができます。
 たとえば、.pngのファイルを読み込み、.jpegのファイルとして出力すれば、png→jpegのフォーマット変換をおこなったことになります。
注: 透明色の扱いが無いなど、細かなところでは専用の変換ツールのようにいかないものがあるかも知れませんがご了承ください。