Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

アスタリスクの活用

タグの編集...

投稿者 XY   (学生)   投稿日時 2016/8/9 09:53:10
VB2013を使っているものです。
panelにイメージを出したいのですが、
        Panel1.BackgroundImage = System.Drawing.Image.FromFile("\テスト", "*")
のようにボタンを押下ときの判定を作ったのですが、”*”の部分で
(追加情報:String "*" から型 'Boolean' への変換は無効です。)というエラーが出てしまいます。
自分がやりたいことは、ファイルの中にある全ての画像を選択したいのですがうまくできません。
改善点を教えていただけませんでしょうか


投稿者 魔界の仮面弁士   (社会人)   投稿日時 2016/8/9 10:33:04
> System.Drawing.Image.FromFile("\テスト", "*")

Image.FromFile の引数に (String, String) という組み合わせは用意されていません。
https://msdn.microsoft.com/ja-jp/library/system.drawing.image.fromfile.aspx


> ファイルの中にある全ての画像を選択したい
…ファイルの中にある全ての画像、ではなく
フォルダーの中にある全ての画像、でしょうか?


「フォルダー内のファイルの列挙」という意味であれば、
 ・My.Computer.FileSystem.GetFiles(フォルダ名, 探索階層, 検索パターン)
 ・System.IO.Directory.GetFiles(フォルダ名, 検索パターン, 探索階層)
 ・System.IO.Directory.GetFileSystemEntries(フォルダ名, 検索パターン, 探索階層)
 ・System.IO.Directory.EnumerateFiles(フォルダ名, 検索パターン, 探索階層)
 ・System.IO.Directory.EnumerateFileSystemEntries(フォルダ名, 検索パターン, 探索階層)
などを使えます。
http://dobon.net/vb/dotnet/file/getfiles.html



「ファイルの中にある全ての画像」の場合、元ファイルの形式次第です。

マルチ TIFF や アニメーションGIF のように、
複数画像を内包する画像形式の場合は、
Image.SelectActiveFrame メソッドで
フレームを切り替えることができます。
http://dobon.net/vb/dotnet/graphics/selectactiveframe.html


ZIP などの圧縮ファイル内の画像ということであれば、
圧縮データの展開作業(解凍処理)が必要です。
ZIP ファイルを .NET 4.5 で展開するなら、ZipArchive クラスです。
http://www.atmarkit.co.jp/ait/articles/1502/03/news080.html
それ以外の形式の場合は、Common Archivers Library の DLL を使えます。
http://www.madobe.net/archiver/lib/main.html


それ以外のケースとしては…ファイルの名前付きストリームを
使っていた場合ぐらいでしょうか。この場合、.NET Framework では
対応できないので、API か COM に頼ることになりますね。

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2016/8/9 10:41:28
> 「フォルダー内のファイルの列挙」という意味であれば、
> ・System.IO.Directory.GetFiles(フォルダ名, 検索パターン, 探索階層)
> などを使えます。

System.IO.Directory.GetFiles メソッドを使って、JPEG ファイルを
列挙するサンプルがありました。

Dim jpgFiles() As String = System.IO.Directory.GetFiles(imageDir, "*.jpg")

http://www.atmarkit.co.jp/ait/articles/0508/12/news091.html

上記では、画像の 1 つを Panel の背景に割り当てるのではなく、
列挙した画像すべてを ListView のアイテムとして表示するものなので
実現したい機能そのものでは無いと思いますが、GetFiles の使用例としては
参考になるかと思います。

投稿者 XY   (学生)   投稿日時 2016/8/9 11:37:58
ありがとうございます
Dim jpgFiles() As String = System.IO.Directory.GetFiles(imageDir, "*.jpg")
を使って試そうと思ったのですが、何かをインポートしなければいけないと思うのですが、それがわかりません...
初歩的な質問をしてしまいすみません...

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2016/8/9 13:15:21
> 何かをインポートしなければいけないと思うのですが

System.IO.Directory.GetFiles を使う場合、特に追加の参照設定は不要です。
名前空間をインポートするかどうかはお好みで。

投稿者 XY   (社会人)   投稿日時 2016/8/9 13:50:30
 魔界の仮面弁士さんに教えていただいたサイトでImageListとListViewを使って表示することができました。ありがとうございました。
ここで2つほど質問があります。
1.ListViewに表示した複数ある項目の中で1つをクリックしたときにpictureboxにクリックしたイメージを写すことができるのか
2.画像の下に出ているディレクトリを消すことができるのか
何度も質問をしてしまいすみません
よろしければ処理の方法と解決策を教えていただけませんでしょうか

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2016/8/9 18:22:53
> ImageListとListViewを使って表示することができました。
最初の質問「panelにイメージを出したい」の件はどうなりましたか?

別の質問に変わったのでしょうか。
それとも Panel から ListView に乗り換えたのでしょうか。


> 教えていただいたサイトで
サンプル中の Function createThumbnail の中にある
 g.FillRectangle(New SolidBrush(Color.White), 0, 0, w, h)
の行を削除して、
 g.Clear(Color.Transparent)
に変更しておいて下さい。

元のコードでは SolidBrush のメモリ解放が抜けているため、書き換えが必要です。
ついでに、画像の背景色も White ではなく Transparent にしています。

表示するサンプルが *.jpg だと、何色を使ったとしても差がありませんが、
背景が透明な *.png や *.gif の場合は Transparent の方が良いでしょう。


> pictureboxにクリックしたイメージを写すことができるのか
ListView の ItemSelectionChanged イベントあたりで
If e.IsSelected Then
    PictureBox1.Image = ImageList1.Images(e.Item.ImageIndex)
End If
としてみては如何でしょう。選択されたアイテムに対して反応します。
ImageList に表示されているサムネイルではなく、オリジナルサイズの画像で表示したいのでれば、
PictureBox1.LoadAsync(e.Item.Text)
を使うという手もあります。

選択ではなくクリックが良いのなら、MouseClick イベントを用いて
Dim ht = ListView1.HitTest(e.Location)
If ht IsNot Nothing Then
    PictureBox1.Image = ImageList1.Images(ht.Item.ImageIndex)
End If
にしてみてください。

あるいは、ItemActivate イベントを使う事も出来ます。
http://dobon.net/vb/dotnet/control/lvpointselection.html



> 画像の下に出ているディレクトリを消すことができるのか
アイテムを追加しているのは、
  ListView1.Items.Add(jpgFiles(i), i)
の部分です。

文字列を何も表示したくない場合は、ここを
  ListView1.Items.Add(Nothing, i)
に変更します。ディレクトリ名を除いてファイル名のみにするなら
  ListView1.Items.Add(System.IO.Path.GetFileNameWithoutExtension(jpgFiles(i)), i)
に変更します。拡張子も含めて表示したい場合には
  ListView1.Items.Add(System.IO.Path.GetFileName(jpgFiles(i)), i)
に変更します。

ただし、上記のように書き換えた場合、e.Item.Text に保持していたフルパス情報も
無くなってしまうため、先の PictureBox1.LoadAsync を使うことができなくなってしまいます。

もしも LoadAsync を併用したい場合には、ListView1.Items.Add する際に、
「ファイル名」だけでなく、「フルパス」も一緒にセットしておく必要があります。

具体的には、画像登録処理のところを下記のように変更して見てください。
Dim newItem As New ListViewItem()
newItem.Text = System.IO.Path.GetFileNameWithoutExtension(jpgFiles(i))
newItem.SubItems.Add(jpgFiles(i)).Name = "FullPath"
newItem.SubItems.Add(FileLen(jpgFiles(i))).Name = "FileSize"
newItem.ImageIndex = i
ListView1.Items.Add(newItem)


上記のように登録していれば、ItemSelectionChanged イベントの e.Item.SubItems から
アイテムの附帯情報を取り出せるようになります。

PictureBox1.LoadAsync(e.Item.SubItems("FullPath").Text)
Label1.Text = e.Item.SubItems("FileSize").Text


※上記サンプルでは、フルパスとファイルサイズを附帯させています。