質問編集履歴
1
改善して少し早くなったコードと時間がかかっている処理部分はどこかを説明
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画像ファイルビューワーです。まずディレクトリを選択してそこにある画像ファイルの一覧をサムネイルで表示して、サムネイルのどれかをダブルクリックすると別ウィンドウでその画像が拡大表示されるといったものです。
|