teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

改善して少し早くなったコードと時間がかかっている処理部分はどこかを説明

2021/12/31 01:34

投稿

tada_tadaa
tada_tadaa

スコア114

title CHANGED
File without changes
body CHANGED
@@ -64,4 +64,78 @@
64
64
 
65
65
  End Class
66
66
  ```
67
- お手数をおかけしますがよろしくお願いいたします。
67
+ お手数をおかけしますがよろしくお願いいたします。
68
+
69
+ 追記
70
+ コードの修正によって少し早くなったのでそれを追記します。
71
+ 以下のコードでほぼ2分、メモリ使用量は250メガバイトほどに短縮できました。
72
+ ```VB
73
+ Public Class Form1
74
+
75
+ ' 幅w、高さhのImageオブジェクトを作成
76
+ Function createThumbnail(ByVal image As Image, ByVal w As Integer, ByVal h As Integer) As Image
77
+ Dim canvas As New Bitmap(w, h)
78
+
79
+ Dim g As Graphics = Graphics.FromImage(canvas)
80
+ g.FillRectangle(New SolidBrush(Color.White), 0, 0, w, h)
81
+
82
+ Dim fw As Double = CDbl(w) / CDbl(image.Width)
83
+ Dim fh As Double = CDbl(h) / CDbl(image.Height)
84
+ Dim scale As Double = Math.Min(fw, fh)
85
+
86
+ Dim w2 As Integer = CInt(image.Width * scale)
87
+ Dim h2 As Integer = CInt(image.Height * scale)
88
+
89
+ g.DrawImage(image, (w - w2) \ 2, (h - h2) \ 2, w2, h2)
90
+ g.Dispose()
91
+
92
+ Return canvas
93
+ End Function
94
+
95
+ ' ButtonのClickイベントのハンドラ
96
+ Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
97
+ Dim cnt As Integer = 0
98
+
99
+ Dim imageDir As String = "C:\Users\user\Pictures" ' 画像ディレクトリ
100
+ Dim jpgFiles As String() = System.IO.Directory.GetFiles(imageDir, "*.jpg")
101
+
102
+ Dim width As Integer = 100
103
+ Dim height As Integer = 80
104
+
105
+ ImageList1.ImageSize = New Size(width, height)
106
+ ListView1.LargeImageList = ImageList1
107
+
108
+ Dim thumbnail(jpgFiles.Length - 1) As Image
109
+
110
+ Dim original As Image
111
+ For i As Integer = 0 To jpgFiles.Length - 1 '①のブレイクポイントを置く
112
+ Try
113
+ original = Bitmap.FromFile(jpgFiles(i))
114
+ Catch
115
+ original = My.Resources.Resource1._error
116
+ End Try
117
+ thumbnail(i) = createThumbnail(original, width, height)
118
+ original.Dispose()
119
+ Next
120
+
121
+ ImageList1.Images.AddRange(thumbnail) '②のブレイクポイントを置く
122
+
123
+ For i As Integer = 0 To jpgFiles.Length - 1
124
+ ListView1.Items.Add(jpgFiles(i), i)
125
+ Next
126
+ End Sub
127
+
128
+ End Class
129
+ ```
130
+
131
+ 上記のコードでブレイクポイントを
132
+ ①For i As Integer = 0 To jpgFiles.Length - 1
133
+ の部分と
134
+ ②ImageList1.Images.AddRange(thumbnail)
135
+ の部分に置いてみて時間を計測したところ、Button1を押してから①の部分までで約1秒かかりました。
136
+ 次に①から②の所までは1分38秒かかりました。次に②から最後まで走らせたら22秒かかりました。
137
+ 全体で約2分かかってますが、①から②までのサムネイルを作成する処理に時間がかかっているようです。
138
+ 作ったサムネイルをImageList1に追加するのとListView1.Items.Addの部分で22秒なので、サムネイルを作成する部分をもっと改善出来れば早くなると思います。
139
+
140
+ それと作っている物ですが
141
+ 「Visual Studio 2017」でプロジェクトの作成は「Visual Basic」の「Windowsフォームアプリケーション(.Net Framework)」を選択してプロジェクトを作成しています。どのような目的の物を作るかというと、jpg画像ファイルビューワーです。まずディレクトリを選択してそこにある画像ファイルの一覧をサムネイルで表示して、サムネイルのどれかをダブルクリックすると別ウィンドウでその画像が拡大表示されるといったものです。