|
みなさんご返信ありがとうございます。
・Region作成時のビット走査はBitmapDataを使っています。
・972×1191は日本地図の大きさです。 都道府県(47種類のbipmap)も同じ大きさを使っています。 該当都道府県の部分のみ黒で塗って領域データを取得しています。
・そこは While よりは For ループを使ったほうが… ↑なぜですか!!?まさかForの方が早いとか。
・実行してるハードウェアのスペックはきっとそこまで関係ないと思われます。 サーバ上でもXP上でも同じ速さでした。
・CreateRegionFromImageは自作です。というか他サイトから盗んできました^^ コレに時間がかかっているのはたしかです。 下記に記述致します。
------------------------------------------------------ Private Function CreateRegionFromImage(ByVal sourceImage As Bitmap, ByVal transparencyColor As Color) As Region
' 画像からリージョンを作成する Dim imageBound As New Rectangle(0, 0, sourceImage.Width, sourceImage.Height) Dim imageRegion As New Region
' リージョンを空領域にする imageRegion.MakeEmpty()
' イメージを走査する For y As Integer = imageBound.Y To imageBound.Height - 1
Dim opaqueBound As Rectangle = New Rectangle(0, y, 0, 1) Dim isTransparentLast As Boolean = False Dim isTransparentCurr As Boolean = False
For x As Integer = imageBound.X To imageBound.Width - 1 ' 色を取得 Dim pixelColor As Color = sourceImage.GetPixel(x, y) ' 各コンポーネントが透過色と等しい場合、透過させる isTransparentCurr = (transparencyColor.R = pixelColor.R) And (transparencyColor.G = pixelColor.G) And (transparencyColor.B = pixelColor.B) ' 現在の点を透過させる場合 If isTransparentCurr Then ' 直前の点を透過させるか If isTransparentLast Then ' 透明領域のまま Else ' 透明領域になった If 0 < opaqueBound.Width Then imageRegion.Union(opaqueBound) End If
Else ' 直前の点を透過させるか If isTransparentLast Then ' 不透明領域になった opaqueBound.X = x opaqueBound.Width = 1 Else ' 不透明領域のまま opaqueBound.Width = x - opaqueBound.X + 1 End If End If
' 現在の状態を保存 isTransparentLast = isTransparentCurr
Next x ' 最後の点が不透明領域だった場合 If Not isTransparentLast AndAlso Not isTransparentCurr Then imageRegion.Union(opaqueBound) Next y Return imageRegion
End Function ------------------------------------------------------ とりあえずたくボンさんの方法であたってみます。 何か他に情報ありましたらお願いします。
今この関数を一つの県が通るのに2秒ほどかかります。 47×2で100秒ほどかかってしまうのですが これはもしかして「ものすごく遅」くはない??ですか・・まさかの
|