- ベストアンサー
Bitmap.GetPixelより高速なもの
いまVBでBitmap.GetPixelを使って、グレースケールの画像のRGBを取得しています。 まあグレースケールなんでRGB同じなのでとりあえずRの値を使うとして、 200*300の画像をFor文でBitmap.GetPixelを使うととてもじゃないぐらい遅いです。 ある程度調べると、LockBits()というものが見つかったのですが使い方がわかりません。 教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
補足されたコードをもう一度見直したほうがいいように思います for LY ... for LX ... myBitmapの構築 色情報の取得 if 色判定 then Graphicsオブジェクトの生成 描画 end if next ' LX next ' LY といった構成になっています 2重ループの内側で myBitmapを毎回作成するのは無駄です Graphicsオブジェクトの生成もループの内側でやった場合 連続して判定がTrueを返した場合毎回生成しなおします 変化しないものはループの外へ追い出して見ましょう ' Create a Bitmap object from an image file. Dim myBitmap As New Bitmap(".\Test01.jpg") Dim P As Graphics = PictureBox2.CreateGraphics Dim LY As Long ' イメージ全体で行うなら 299をmyBitmap.Heightに ' 199を myBuitmp.Widthに変更したほうがいいでしょう ' 1行おきの処理なら Stepで調整する For LY = 0 To 299 Step 2 Dim LX As Long For LX = 0 To 199 Try ' Get the color of a pixel within myBitmap. Dim pixelColor As Color = myBitmap.GetPixel(LX, LY) Red = pixelColor.R Label1.Text = "R" + Red If (Red > 40) Then P.FillRectangle(Brushes.White, LX, LY, 1, 1) End If Catch ex As Exception End Try Next ' 1行おきの処理をしたいのであれば For文にStepをつけましょう ' Forなど自動でカウントアップ(またはダウン)するものを ' コード内でいじってしまうのはあまり行儀がよくありません ' LY = LY + 1 Next といった具合で 速度がずいぶん改善されるように思います
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
VB.NET付属のMSDN(またはWebサイト)で LockBitsメソッドについて調べてみたのでしょうか? 簡単なサンプルも記載されていますよ http://msdn.microsoft.com/ja-jp/library/5ey6h79d.aspx ここのサンプルは BitmapオブジェクトにJpgイメージを読み込み 読み込んだBitmapのLockBitsメソッドでBmpData型のオブジェクトを取得します 取得したBmpDataのStrideプロパティがその画像の横幅に必要なバイト数でこれにBitmapの高さを乗算してイメージを表すのに必要なByte配列を作成します 作成した配列に 元のイメージデータをコピー コピーされたデータの3番目の要素から3個おきにデータを255に設定 24ビット構成ならば赤(R)のデータのみ255にします 加工が終わったら元のイメージデータを書き換えます 書き換えが終了したら UnlockBitsでロックを解除 書き換えたイメージを描画 といった流れになっています
- DreamyCat
- ベストアンサー率56% (295/524)
windows API のgetpixel というのでやってみました。 速いのか遅いのかわかりませんが、 for nextのループによる約50万点の取得で3秒くらいでした。 古いノートPC でCPUはceleron M(2Ghz)です。
補足
自慢ではないのですが私のPCの方が処理速度は速いみたいなのですが、 もっと時間がかかりました。20分くらい。 画像のサイズは200*300です。 こんな感じです。 Dim LY As Long For LY = 0 To 299 Dim LX As Long For LX = 0 To 199 Try ' Create a Bitmap object from an image file. Dim myBitmap As New Bitmap(".\Test01.jpg") ' Get the color of a pixel within myBitmap. Dim pixelColor As Color = myBitmap.GetPixel(LX, LY) Red = pixelColor.R Label1.Text = "R" + Red If (Red > 40) Then Dim P As Graphics = PictureBox2.CreateGraphics P.FillRectangle(Brushes.White, LX, LY, 1, 1) End If Catch ex As Exception End Try Next LY = LY + 1 Next こんな感じで画像のRの値が40以上の点をPicturebox2の点に打っているのですがとても時間がかかります。どんなソースなのかくわしく教えてください。 お願いします
お礼
ありがとうございました。 これを参考にしていただいたら12秒ほどでできるようになり、その後さらに改良し、今は3秒ほどでできるようになりました。 本当にありがとうございました