System.Drawing.Bitmapオブジェクトはインスタンス生成時に画像へのデコードまでやってしまうので、画像の縦横のサイズといったメタデータを読みたいだけなら無駄が多いです。 // もちろん、画像処理本体には結局画像デコードが必要でしょうが…。 .NET Framework標準ライブラリの中では、PresentationCore.dllに含まれるSystem.Windows.Media.Imaging.BitmapDecodeクラスを中心としたクラスを使えば、不要な画像デコードを行わなずにすむように記述できます。 Dim decoder As BitmapDeocder = BitmapDecoder.Create(fs, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None) Dim width As Integer = decoder.Frames(0).PixelWidth Dim height As Integer = decoder.Frames(0).PixelHeight
Hongliangさん、魔界の仮面弁士さん、アドバイスありがとうございます。
>System.Drawing.Bitmapオブジェクトはインスタンス生成時に画像へのデコードまでやってしまうので、画像の縦横のサイズといったメタデータを読みたいだけなら無駄が多いです。
やっぱりそうですよね。
とういうわけで、↓のように直してみました。
----------------------------------
Dim imagew, imageh As Integer
Dim fs As System.IO.FileStream
fs = New System.IO.FileStream(ファイル名, IO.FileMode.Open, IO.FileAccess.Read)
Using img = System.Drawing.Image.FromStream(fs)
imagew = img.Width
imageh = img.Height
End Using
fs.Close()
----------------------------------
体感的に速度は変わらないようでした。残念!
>Parallels.For を併用してみるのはいかがでしょう。
えっ?なにそれ?と思って検索してみたら、並列処理ができるんですね!
単純に
For i = 0 To files.Length - 1
↓
Parallel.For(0, files.Length,
Sub(i)
みたいに変えてみましたが、プログレスバーへの設定とかで
ProgressBar.Value = i
なんか挙動不審になっちゃうようです。
複数のスレッドから操作しようとすれば、そりゃ当然でしょうね。
でも、これは高速化に効きそうなので、もう少し調べてみます。
ありがとうございました!