前提・実現したいこと
.NET Framework 4.5.2にて、白黒2値のTIFF画像ファイルを読み込み、各座標の色を配列に編集しようとしています。
この処理を高速で行う手法・方法を探しています。
発生している問題・エラーメッセージ
下記の流れでinteger配列に編集する処理を作成してみました。
VB.NET
1Dim img As Bitmap = Image.FromFile("TIFF画像ファイルのパス") 2Dim colors(img.Width - 1, img.Height - 1) As Integer 3 4For x = 0 To img.Width - 1 5 6 For y = 0 To img.Height - 1 7 8 colors(x, y) = img.GetPixel(x, y).ToArgb 9 10 Next 11 12Next
しかし、実際に複数の画像を処理させようとしたところ、
処理ファイル数が多くなった際の動作が遅かった為、
別の実装がないか調査しています。
(100 x 100のTIFF画像で1秒当たり100ファイル程度でした。)
前提にある通り、処理対象を白黒2値のTIFF画像に限定した場合、
配列に各座標の色を高速に編集する手法・方法はないでしょうか?
試したこと
白黒のみを判定できればいい為、ARGBの取得を下記の通りRのみに変更してみましたが、
速度はほぼ変わらずでした。
VB.NET
1Dim colors(img.Width - 1, img.Height - 1) As Byte 'IntegerからByteへ変更 2 3For x = 0 To img.Width - 1 4 5 For y = 0 To img.Height - 1 6 7 colors(x, y) = img.GetPixel(x, y).R 'ToArgbからRへ変更 8 9 Next 10 11Next
補足情報
Microsoft Docs Bitmap.GetPixel
https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.bitmap.getpixel?view=netframework-4.5.2
解決したコード
VB.NET
1Dim img As Bitmap = Image.FromFile("TIFF画像ファイルのパス") 2 3'ロック 4Dim bmpData As BitmapData = img.LockBits(New Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadWrite, img.PixelFormat) 5 6'ピクセルデータをバイト型配列で取得する 7Dim pixels As Byte() = New Byte(bmpData.Stride * img.Height - 1) {} 8Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, pixels, 0, pixels.Length) 9 10'ロック解除 11img.UnlockBits(bmpData)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/22 08:53