|
やはりビットマップ上のスキャンでは時間がかかるため、 Imaging.BitmapDataよりビットマップの色コードをバイト配列で取得しようと思います。
Dim bmp As Bitmap Dim bmData As Imaging.BitmapData Dim rect As Rectangle Dim intStride As Integer Dim Scan0 As System.IntPtr Dim bytBits As Byte()
'bmpのフォーマットはImaging.PixelFormat.Format32bppArgbである。
rect = New Rectangle(0, 0, bmp.Width, bmp.Height) bmData = bmp.LockBits(rect, _ Imaging.ImageLockMode.ReadOnly, _ Imaging.PixelFormat.Format24bppRgb)
intStride = bmData.Stride Scan0 = bmData.Scan0 bytBits = New Byte(intStride * bmp.Height - 1) {}
Marshal.Copy(Scan0, bytBits, 0, intStride * bmp.Height) bmp.UnlockBits(bmData)
このバイト配列内を検索した方が処理が速いようですので、この方法で行おうと思いますが、 BitmapDataを取得する際、PixelFormatをFormat24bppRgbにしているので、BitmapDataの Strideがビットマップの横ピクセル数×3(RGB分)より若干多いようなのですが (画像によって違うようである)、このバイト配列の色情報を見ようとするとき、 Stride毎に区切ったデータにおいて、ビットマップの横ピクセル数×3をはみ出た部分は ビットマップの色情報とは関係ないですよね?
|