画像ビューア


Windowsですと、「Windows フォト ギャラリー」とか、画像を閲覧するためのアプリが付属していますが、それっぽい何かを作ってみます。
「あるディレクトリ内にある画像データを次々表示」みたいな感じのプログラムが目標です。

ということはまず、ディレクトリ内のファイルの名前を取得することから始めなければなりませんね。
指定されたディレクトリ内のすべてのファイルのパスを取得するには、
File.GetFiles(directoryPath)
を使います。
取得するだけのプログラムなら、そんなに難しくはないですね。

GraphicsWindow.Width = 500
GraphicsWindow.Height = 300
GraphicsWindow.Title = "viewer"
GraphicsWindow.FontName = "Meiryo UI"
GraphicsWindow.FontSize = 16
GraphicsWindow.BrushColor = "Black"

dirname = Controls.AddTextBox(1, 1)
Controls.SetTextBoxText(dirname, "D:\test")

Controls.AddButton("取得", 200, 1)

Controls.ButtonClicked = buttonclk

Sub buttonclk
  dir = File.GetFiles(Controls.GetTextBoxText(dirname))
  GraphicsWindow.DrawBoundText(0, 30, 500, dir)
EndSub

「取得」ボタンを押すと、テキストボックスに書かれているディレクトリのファイル名を取得して描いてくれるというプログラムです。
これを実行すると……。

画像ビューア

こんな感じになります。「D:\test」には予め、画像ファイル4個とテキストファイル1個を入れておきましたが、取得するとこういう文章になるのです。
この文章は「配列」というもので、「dir[1]」は1個目の値、「dir[2]」は2個目の値、……と対応しており便利です。
ちなみにこの「配列」の中に値が幾つ入っているかは「Array.GetItemCount(array)」で求められます。

つまり、サブルーチンの中身をこう変えれば……

Sub buttonclk
  dir = File.GetFiles(Controls.GetTextBoxText(dirname))
  GraphicsWindow.DrawBoundText(0, 30, 500, dir)
  For x = 1 To Array.GetItemCount(dir)
    GraphicsWindow.DrawBoundText(0, 100 + 20 * x, 500, dir[x])
  EndFor
EndSub

これで配列全ての値をずらっと並べられます。

画像ビューア

次は、この中から画像ファイルのパスを取り出します。
ここでの画像ファイルは、拡張子が「.jpg」「.bmp」「.png」の3種ということにしておきます。
与えられたテキストが、指定されたサブテキストの内容で終わりになっているかどうかを取得する、Text.EndsWith(text, subText)を使ってみましょう。

Sub buttonclk
  dir = File.GetFiles(Controls.GetTextBoxText(dirname))
  GraphicsWindow.DrawBoundText(0, 30, 500, dir)
  For x = 1 To Array.GetItemCount(dir)
    If Text.EndsWith(dir[x], ".jpg") Or Text.EndsWith(dir[x], ".bmp") Or Text.EndsWith(dir[x], ".png") Then
      GraphicsWindow.DrawBoundText(0, 100 + 20 * x, 500, dir[x])
    EndIf
  EndFor
EndSub

これで画像ファイル一覧が表示されます。
この一覧を新たな配列に登録し、更に「次へ」ボタンのようなものを設置して、このボタンを押す度に配列の画像が表示されるようにすれば、画像ビューアの完成になりそうです。
新たな配列を作るために、「picnumber」という変数を用意しておきます。初期値は1、つまりpicnumber = 1をプログラムの最初の方に入れておきます。
そして、

picnumber = 1
(省略)
For x = 1 To Array.GetItemCount(dir)
  If Text.EndsWith(dir[x], ".jpg") Or Text.EndsWith(dir[x], ".bmp") Or Text.EndsWith(dir[x], ".png") Then
    picture[picnumber] = dir[x]
    GraphicsWindow.DrawBoundText(0, 100 + 20 * x, 500, picture[picnumber])
    picnumber = picnumber + 1
  EndIf
EndFor

「picture」という新たな配列を作りました。これで画像ファイルのみの配列が完成。
あとは、画像を表示するのみです。
「取得」ボタンを押した時に、配列「picture」の1番目の画像のみ表示させてみます。
画像表示自体は簡単なのですが、問題は画像のサイズです。
画像のサイズが大きすぎる時は、ウィンドウに収まるように縮小したいですね。
画像の横幅・縦幅は、ImageList.GetWidthOfImageImageList.GetHeightOfImageで取得できます。
また、画像を縮小して表示する場合は、GraphicsWindow.DrawResizedImageを使えばOKです。
例えば、画像ファイル「picture[1]」の横幅又は縦幅が700ピクセルを越えている時のみ縮小したいのであれば、

picwidth = ImageList.GetWidthOfImage(picture[1])
picheight = ImageList.GetHeightOfImage(picture[1])
GraphicsWindow.DrawText(1, 30, picture[1])
If 700 <= picwidth Or 700 <= picheight Then
  GraphicsWindow.DrawText(1, 60, picwidth + "pixel x " + picheight + "pixel (resized)")
  GraphicsWindow.DrawResizedImage(picture[1], 0, 100, 700, 700)
Else
  GraphicsWindow.DrawText(1, 60, picwidth + "pixel x " + picheight + "pixel")
  GraphicsWindow.DrawResizedImage(picture[1], 0, 100, picwidth, picheight)
EndIf

こんな感じです。
ということで話がやや飛びますが、「次」ボタンを付けて、ディレクトリ内の画像を表示するプログラムは以下の通り。

GraphicsWindow.Width = 800
GraphicsWindow.Height = 800
GraphicsWindow.Title = "viewer"
GraphicsWindow.FontName = "Meiryo UI"
GraphicsWindow.FontSize = 16
GraphicsWindow.BrushColor = "Black"

dirname = Controls.AddTextBox(1, 1)
Controls.SetTextBoxText(dirname, "D:\test")

syutokub = Controls.AddButton("取得", 200, 1)
nextb = Controls.AddButton("次", 200, 1)
Controls.HideControl(nextb)

Controls.ButtonClicked = buttonclk
picnumber = 1

Sub buttonclk
  If Controls.LastClickedButton = syutokub Then
    GraphicsWindow.BrushColor = "White"
    GraphicsWindow.FillRectangle(0, 30, 800, 800)
    GraphicsWindow.BrushColor = "Black"
    Controls.HideControl(syutokub)
    Controls.ShowControl(nextb)
    dir = File.GetFiles(Controls.GetTextBoxText(dirname))
    For x = 1 To Array.GetItemCount(dir)
      If Text.EndsWith(dir[x], ".jpg") Or Text.EndsWith(dir[x], ".bmp") Or Text.EndsWith(dir[x], ".png") Then
        picture[picnumber] = dir[x]
        picnumber = picnumber + 1
      EndIf
    EndFor
    picwidth = ImageList.GetWidthOfImage(picture[1])
    picheight = ImageList.GetHeightOfImage(picture[1])
    GraphicsWindow.DrawText(1, 30, picture[1])
    If 700 <= picwidth Or 700 <= picheight Then
      GraphicsWindow.DrawText(1, 60, picwidth + "pixel x " + picheight + "pixel (resized)")
      GraphicsWindow.DrawResizedImage(picture[1], 0, 100, 700, 700)
    Else
      GraphicsWindow.DrawText(1, 60, picwidth + "pixel x " + picheight + "pixel")
      GraphicsWindow.DrawResizedImage(picture[1], 0, 100, picwidth, picheight)
    EndIf
    picnumber = 2
  EndIf
  
  If Controls.LastClickedButton = nextb Then
    If picnumber = Array.GetItemCount(picture) + 1 Then
      Controls.HideControl(nextb)
      Controls.ShowControl(syutokub)
    Else
      GraphicsWindow.BrushColor = "White"
      GraphicsWindow.FillRectangle(0, 30, 800, 800)
      GraphicsWindow.BrushColor = "Black"
      picwidth = ImageList.GetWidthOfImage(picture[picnumber])
      picheight = ImageList.GetHeightOfImage(picture[picnumber])
      GraphicsWindow.DrawText(1, 30, picture[picnumber])
      If 700 <= picwidth Or 700 <= picheight Then
        GraphicsWindow.DrawText(1, 60, picwidth + "pixel x " + picheight + "pixel (resized)")
        GraphicsWindow.DrawResizedImage(picture[picnumber], 0, 100, 700, 700)
      Else
        GraphicsWindow.DrawText(1, 60, picwidth + "pixel x " + picheight + "pixel")
        GraphicsWindow.DrawResizedImage(picture[picnumber], 0, 100, picwidth, picheight)
      EndIf
      picnumber = picnumber + 1
    EndIf
  EndIf
EndSub

画像ビューア

画像ビューア

なお、ファイルサイズが大きい画像ファイルは処理が重くなります。
あまりにも大きいファイル(10MBを越えるくらいの)は、表示しないようにするのもひとつの手だと思います。


▲TOPへ戻る