アプリ版:「スタンプのみでお礼する」機能のリリースについて

いまVBでBitmap.GetPixelを使って、グレースケールの画像のRGBを取得しています。
まあグレースケールなんでRGB同じなのでとりあえずRの値を使うとして、
200*300の画像をFor文でBitmap.GetPixelを使うととてもじゃないぐらい遅いです。
ある程度調べると、LockBits()というものが見つかったのですが使い方がわかりません。 教えてください。

A 回答 (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

といった具合で 速度がずいぶん改善されるように思います
    • good
    • 0
この回答へのお礼

ありがとうございました。 これを参考にしていただいたら12秒ほどでできるようになり、その後さらに改良し、今は3秒ほどでできるようになりました。
本当にありがとうございました

お礼日時:2009/06/16 20:59

VB.NET付属のMSDN(またはWebサイト)で LockBitsメソッドについて調べてみたのでしょうか?



簡単なサンプルも記載されていますよ
http://msdn.microsoft.com/ja-jp/library/5ey6h79d …
ここのサンプルは BitmapオブジェクトにJpgイメージを読み込み
読み込んだBitmapのLockBitsメソッドでBmpData型のオブジェクトを取得します
取得したBmpDataのStrideプロパティがその画像の横幅に必要なバイト数でこれにBitmapの高さを乗算してイメージを表すのに必要なByte配列を作成します
作成した配列に 元のイメージデータをコピー
コピーされたデータの3番目の要素から3個おきにデータを255に設定
24ビット構成ならば赤(R)のデータのみ255にします
加工が終わったら元のイメージデータを書き換えます
書き換えが終了したら UnlockBitsでロックを解除
書き換えたイメージを描画
といった流れになっています

参考URL:http://msdn.microsoft.com/ja-jp/library/5ey6h79d …
    • good
    • 0

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の点に打っているのですがとても時間がかかります。どんなソースなのかくわしく教えてください。 お願いします

補足日時:2009/06/15 22:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!