質問編集履歴

1

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

2021/12/31 01:34

投稿

tada_tadaa
tada_tadaa

スコア111

test CHANGED
File without changes
test CHANGED
@@ -131,3 +131,151 @@
131
131
  ```
132
132
 
133
133
  お手数をおかけしますがよろしくお願いいたします。
134
+
135
+
136
+
137
+ 追記
138
+
139
+ コードの修正によって少し早くなったのでそれを追記します。
140
+
141
+ 以下のコードでほぼ2分、メモリ使用量は250メガバイトほどに短縮できました。
142
+
143
+ ```VB
144
+
145
+ Public Class Form1
146
+
147
+
148
+
149
+ ' 幅w、高さhのImageオブジェクトを作成
150
+
151
+ Function createThumbnail(ByVal image As Image, ByVal w As Integer, ByVal h As Integer) As Image
152
+
153
+ Dim canvas As New Bitmap(w, h)
154
+
155
+
156
+
157
+ Dim g As Graphics = Graphics.FromImage(canvas)
158
+
159
+ g.FillRectangle(New SolidBrush(Color.White), 0, 0, w, h)
160
+
161
+
162
+
163
+ Dim fw As Double = CDbl(w) / CDbl(image.Width)
164
+
165
+ Dim fh As Double = CDbl(h) / CDbl(image.Height)
166
+
167
+ Dim scale As Double = Math.Min(fw, fh)
168
+
169
+
170
+
171
+ Dim w2 As Integer = CInt(image.Width * scale)
172
+
173
+ Dim h2 As Integer = CInt(image.Height * scale)
174
+
175
+
176
+
177
+ g.DrawImage(image, (w - w2) \ 2, (h - h2) \ 2, w2, h2)
178
+
179
+ g.Dispose()
180
+
181
+
182
+
183
+ Return canvas
184
+
185
+ End Function
186
+
187
+
188
+
189
+ ' ButtonのClickイベントのハンドラ
190
+
191
+ Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
192
+
193
+ Dim cnt As Integer = 0
194
+
195
+
196
+
197
+ Dim imageDir As String = "C:\Users\user\Pictures" ' 画像ディレクトリ
198
+
199
+ Dim jpgFiles As String() = System.IO.Directory.GetFiles(imageDir, "*.jpg")
200
+
201
+
202
+
203
+ Dim width As Integer = 100
204
+
205
+ Dim height As Integer = 80
206
+
207
+
208
+
209
+ ImageList1.ImageSize = New Size(width, height)
210
+
211
+ ListView1.LargeImageList = ImageList1
212
+
213
+
214
+
215
+ Dim thumbnail(jpgFiles.Length - 1) As Image
216
+
217
+
218
+
219
+ Dim original As Image
220
+
221
+ For i As Integer = 0 To jpgFiles.Length - 1 '①のブレイクポイントを置く
222
+
223
+ Try
224
+
225
+ original = Bitmap.FromFile(jpgFiles(i))
226
+
227
+ Catch
228
+
229
+ original = My.Resources.Resource1._error
230
+
231
+ End Try
232
+
233
+ thumbnail(i) = createThumbnail(original, width, height)
234
+
235
+ original.Dispose()
236
+
237
+ Next
238
+
239
+
240
+
241
+ ImageList1.Images.AddRange(thumbnail) '②のブレイクポイントを置く
242
+
243
+
244
+
245
+ For i As Integer = 0 To jpgFiles.Length - 1
246
+
247
+ ListView1.Items.Add(jpgFiles(i), i)
248
+
249
+ Next
250
+
251
+ End Sub
252
+
253
+
254
+
255
+ End Class
256
+
257
+ ```
258
+
259
+
260
+
261
+ 上記のコードでブレイクポイントを
262
+
263
+ ①For i As Integer = 0 To jpgFiles.Length - 1
264
+
265
+ の部分と
266
+
267
+ ②ImageList1.Images.AddRange(thumbnail)
268
+
269
+ の部分に置いてみて時間を計測したところ、Button1を押してから①の部分までで約1秒かかりました。
270
+
271
+ 次に①から②の所までは1分38秒かかりました。次に②から最後まで走らせたら22秒かかりました。
272
+
273
+ 全体で約2分かかってますが、①から②までのサムネイルを作成する処理に時間がかかっているようです。
274
+
275
+ 作ったサムネイルをImageList1に追加するのとListView1.Items.Addの部分で22秒なので、サムネイルを作成する部分をもっと改善出来れば早くなると思います。
276
+
277
+
278
+
279
+ それと作っている物ですが
280
+
281
+ 「Visual Studio 2017」でプロジェクトの作成は「Visual Basic」の「Windowsフォームアプリケーション(.Net Framework)」を選択してプロジェクトを作成しています。どのような目的の物を作るかというと、jpg画像ファイルビューワーです。まずディレクトリを選択してそこにある画像ファイルの一覧をサムネイルで表示して、サムネイルのどれかをダブルクリックすると別ウィンドウでその画像が拡大表示されるといったものです。