DOBON.NETプログラミング道掲示板

[ 最新記事及び返信フォームをトピックトップへ ]

■33830 / inTopicNo.1)  サムネイルを新しい順にファイル名のみで表示したい。
  
□投稿者/ けい 一般人(7回)-(2018/04/12(Thu) 12:23:09)
  • アイコン環境/言語:[Windows10、VB.NET、.NET Framework4.5.2] 
    分類:[.NET] 

    お世話になります。

    ボタン(btnGet)を押すと、
    特定のフォルダの中にあるJPEG画像ファイル(.jpg)一覧を、
    リストビュー(ListView1)に、サムネイルで表示させたいと思います。
    ファイルは、001.jpg、002.jpg、003.jpgの3つがあるとします。

    コードは以下の通りです。

    -------------------------------

    Private Sub btnGet_Click(sender As Object, e As EventArgs) Handles btnGet.Click

    ImageList1.Images.Clear()
    ListView1.Clear()

    Dim jpgFiles As String() = System.IO.Directory.GetFiles(フォルダパス名, "*.jpg")

    Dim width As Integer = 100
    Dim height As Integer = 80

    ImageList1.ImageSize = New Size(width, height)
    ListView1.LargeImageList = ImageList1

    For i As Integer = 0 To jpgFiles.Length - 1・・・(*)

    Dim original As Image = Bitmap.FromFile(jpgFiles(i))
    Dim thumbnail As Image = createThumbnail(original, width, height)

    ImageList1.Images.Add(thumbnail)
    ListView1.Items.Add(jpgFiles(i), i)

    original.Dispose()
    thumbnail.Dispose()
    Next
    End Sub

    Private Function createThumbnail(ByVal image As Image, ByVal w As Integer, ByVal h As Integer) As Image
    Dim canvas As New Bitmap(w, h)

    Dim g As Graphics = Graphics.FromImage(canvas)
    g.FillRectangle(New SolidBrush(Color.White), 0, 0, w, h)

    Dim fw As Double = CDbl(w) / CDbl(image.Width)
    Dim fh As Double = CDbl(h) / CDbl(image.Height)
    Dim scale As Double = Math.Min(fw, fh)

    Dim w2 As Integer = CInt(image.Width * scale)
    Dim h2 As Integer = CInt(image.Height * scale)

    g.DrawImage(image, (w - w2) \ 2, (h - h2) \ 2, w2, h2)
    g.Dispose()

    Return canvas
    End Function

    -------------------------------

    上記を実行しますと、
    リストビューのサムネイルがファイル作成日付昇順に表示されます。
    また、表示されるサムネイルの下には、
    「(フォルダパス名)\(ファイル名)」が、
    表示されます。

    これをまず、ファイル作成日付降順で表示させたいです。

    上記(*)の部分を、

    For i As Integer = jpgFiles.Length - 1 To 0 Step -1

    に書き換えたところ、「(フォルダパス名)\(ファイル名)」は降順で表示されるのですが、サムネイル自体は降順にならず、昇順のまま、表示されてしまいます。

    すなわち、001.jpgのサムネイルのファイル名が003.jpg、
    003.jpgのサムネイルのファイル名が001.jpg、
    という具合になってしまいます。

    これを解決するためにどうしたら、悩んでいます。

    また、「(フォルダパス名)\(ファイル名)」が長いため、
    (ファイル名)だけをサムネイル下に表示させたいと考えています。

    お分かりになる方がいらっしゃいましたら、アドバイス頂けましたら幸いです。

    どうぞよろしくお願い致します。



マルチポストを報告
違反を報告
引用返信 削除キー/
■33831 / inTopicNo.2)  Re[1]: サムネイルを新しい順にファイル名のみで表示したい。
□投稿者/ けい 一般人(8回)-(2018/04/12(Thu) 12:55:21)
  • アイコンNo33830に返信(けいさんの記事)
    > お世話になります。

    Dim s As Integer = 0

    を別途宣言しておき、

    > For i As Integer = jpgFiles.Length - 1 To 0 Step -1
    >
    > Dim original As Image = Bitmap.FromFile(jpgFiles(i))
    > Dim thumbnail As Image = createThumbnail(original, width, height)
    >
    > ImageList1.Images.Add(thumbnail)
    > ListView1.Items.Add(jpgFiles(i), s)・・・(※)
    s = s + 1・・・(※)
    >
    > original.Dispose()
    > thumbnail.Dispose()
    > Next
    > End Sub

    の(※)の部分の変更で、降順の問題は解決できました。

    サムネイルのファイル名表示について、引き続き、取り組みます。

違反を報告
引用返信 削除キー/
■33832 / inTopicNo.3)  Re[1]: サムネイルを新しい順にファイル名のみで表示したい。
□投稿者/ 魔界の仮面弁士 大御所(1108回)-(2018/04/13(Fri) 10:41:43)
  • アイコン2018/04/13(Fri) 13:09:11 編集(投稿者)

    No33830に返信(けいさんの記事)
    > これをまず、ファイル作成日付降順で表示させたいです。
    日付順に並び替えてから登録するか、もしくは
    いったん登録してから ListView1.Sort() で並び替えるかですね。


    前者案『事前に並び替えておく』を採用するのであれば、
    Linq を使って OrderBy() しておくのが手っ取り早いでしょう。


    '元の並び順
    Dim jpgFiles As String() = System.IO.Directory.GetFiles(フォルダパス名, "*.jpg")

    '作成日順
    'Dim jpgFiles As String() = System.IO.Directory.EnumerateFiles(フォルダパス名, "*.jpg").OrderBy(Function(jpg) New System.IO.FileInfo(jpg).CreationTime).ToArray()

    '更新日順
    'Dim jpgFiles As String() = System.IO.Directory.EnumerateFiles(フォルダパス名, "*.jpg").OrderBy(Function(jpg) New System.IO.FileInfo(jpg).LastWriteTim).ToArray()


    並び替えるにあたり、ファイルの日時というものは、
    作成日時<更新日時になる場合もあれば、
    更新日時<作成日時になる場合もありえますので
    ご注意ください。


    また、複数のファイルで同じ日時が割り当てられていた場合に備え、
    OrderBy() だけでなく ThenBy() も加えておくことをお奨めします。


    後者案『登録後に後からソートできるようにする』の場合には、
    ListViewItemSorter プロパティに対して、ソート用の
    IComparer インターフェイスの実装を割り当てるようにします。
    https://msdn.microsoft.com/ja-jp/library/system.windows.forms.listview.listviewitemsorter%28v=vs.110%29.aspx

    IComparer.Compare メソッドに、ListViewItem 同士の比較を記述しますが
    この場合、比較するための「日付」が必要になるので、登録する際に
    >> ListView1.Items.Add(jpgFiles(i), i)
    の段階で、ListViewItem だけでなく ListViewSubItem クラスも
    .SubItems.Add しておき、そのサブアイテムに追加情報、たとえば
     ・ファイル名
     ・ファイルのフルパス
     ・ファイル作成日
     ・ファイル更新日
     ・ファイルサイズ
    などを書き込んでおくと便利かと思います。
    (今回は日時データだけで OK ですが)

    この場合、サブアイテムは文字列として割り当てることになるので
    文字列ソートしやすいよう固定長文字列に整形しておくと楽かと思います。
    (または ListViewItem を継承して、日付のプロパティを追加するとか)

    ただ、サブアイテムに埋め込まずとも、既にフルパスは分かっているので、
    並び替えの際にファイルを読み直して作成日を求めなおしても良いですね。
違反を報告
引用返信 削除キー/
■33833 / inTopicNo.4)  Re[2]: サムネイルを新しい順にファイル名のみで表示したい。
□投稿者/ けい 一般人(9回)-(2018/04/14(Sat) 14:52:52)
  • アイコンNo33832に返信(魔界の仮面弁士さんの記事)

    ご教示ありがとうございます^^。
    たいへん助かります。

    頂きましたアドバイスを参考に、
    取り組んでみます。
解決み!
違反を報告
引用返信 削除キー/
■33834 / inTopicNo.5)  Re[3]: サムネイルを新しい順にファイル名のみで表示したい。
□投稿者/ けい 一般人(10回)-(2018/04/14(Sat) 18:01:12)
  • アイコンNo33833に返信(けいさんの記事)

    サムネイルのファイル名表示については、

    ListView1.Items.Add(jpgFiles(i), s)・・・(※)

    を、

    ListView1.Items.Add(System.IO.Path.GetFileName(jpgFiles(i)), s)

    にすることで、

    解決できました。

    ありがとうございました。
解決み!
違反を報告
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

Mode/  Pass/


- Child Tree -