• ベストアンサー

VB.NETのことで困っています。

VB.NETのプログラムで白黒判別プログラムを作成することになったのですが、GetPicxelの使い方が間違っているらしく正しくカウントしてくれません。 ちなみに今作成している問題のプログラムは以下のプログラムです。 Function CountNumColor(ByRef DotWW As Long, ByRef DotHH As Long, ByRef CHECK_C As Long) As Integer Dim Form1 As Object Dim NumEQ As Double Dim NumNot As Long Dim x, y As Long NumEQ = 0 NumNot = 0 System.Windows.Forms.Application.DoEvents() For x = 0 To DotHH - 1 For y = 0 To DotWW - 1 System.Windows.Forms.Application.DoEvents() If CHECK_C = Val("Bitmap.GetPixel(x,y)") Then NumEQ = NumEQ + 1 Else NumNot = NumNot + 1 Debug.Write("x,y,Val(Bitmap.GetPixel(x, y)") End If Next y Next x CountNumColor = NumEQ End Function このプログラムで問題がありましたらぜひとも教えてください。GetPicxel以外の間違いに気づいた人がいた場合もご意見をお待ちしております。また、この質問で分からないことがございましたら遠慮なく書き込んでください。気づき次第返答いたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

No.2の回答者です。 質問の関数内には見当たりませんが、以下のような、どのイメージファイルを対象とするかのインスタンスは作成してますでしょうか?  Dim myBitmap As New Bitmap("c:\Test.jpg")  言うまでもないとは思いますが、「c:\Test.jpg」部分は、実際判定したいファイルのパスに入替てください。  上記の文を入れておいて、その後以下の文を入れれば波線はでないかと思います。  If System.Drawing.Color.Black.ToArgb() = myBitmap.GetPixel(x, y).ToArgb() Then  Bitmapそのものを使うわけにはいかないので、「Bitmap」は「myBitmap」に「GetPixel(1, 1)」は「GetPixel(x, y)」に変えています。  「GetPixel(1, 1)」は、私がテストしたときのまま載せてしまったので・・・。    これでうまくいくかと思うのですが、どうでしょうか。

kisisuku
質問者

お礼

ありがとうございます。 波線のエラーは消えましたが、白と黒を半分ずつ読み込んで50%と50%という風にカウントする変な現象が起こるようになってしまいました。どうしたらいいでしょうか?変更後の内容は以下のプログラムです。 Function CountNumColor(ByRef DotWW As Long, ByRef DotHH As Long, ByRef CHECK_C As Long) As Integer Dim Form1 As Object Dim NumEQ As Double Dim NumNot As Long Dim x, y As Long Dim ChkColor As Color = Color.FromArgb(0) Dim myBitmap As New Bitmap("E:\2005\画像処理システム\黒.bmp") NumEQ = 0 NumNot = 0 System.Windows.Forms.Application.DoEvents() For x = 0 To DotHH - 1 For y = 0 To DotWW - 1 System.Windows.Forms.Application.DoEvents() ChkColor = myBitmap.GetPixel(x, y) If ChkColor.R = 0 And ChkColor.G = 0 And ChkColor.B = 0 Then NumEQ = NumEQ + 1 Else NumNot = NumNot + 1 Debug.Write("x,y,Val(Bitmap.GetPixel(x, y)") End If Next y Next x CountNumColor = NumEQ End Function なぜか心当たりはありますか?全部のプログラムを一旦載せた方がいいのでしょうか?

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

そうですね、見た感じは間違っていないようです。 しかし、この関数だと黒は判別してますが、白は判別してないと思いますよ。R=0;G=0;B=0の色かそれ以外かですよね。    全体のソースを送ってもらえば、確かにわかりやすいですが、「E:\2005\画像処理システム\黒.bmp」のファイルの中身のほうが気になります。    例えば、R=1;G=1;B=1の色でも、普通の人には真っ黒にしか見えないはずです。50対50と言われるとどうしてもタイルパターンの濃さがちょっと違うだけの黒が交互に並んでいるビットマップを想像してしまうのですが、どうでしょうか。  

kisisuku
質問者

お礼

回答ありがとうございます。 補足し忘れましたが、画像ははじめから白黒にした画像を使用していますw おかげさまで黒の画像を読み込むことができました。 ほんとにありがとうございます。

すると、全ての回答が全文表示されます。
回答No.2

 No.1の回答者さんが最後におっしゃっているように Bitmap.GetPixel(x,y) の部分はColor構造体を戻り値として返すので、Long型との比較はできないはずです。  Val()は引数文字列を数値型に変えるので無理矢理 "Bitmap.GetPixel(x,y)"と文字列にして引数に入れれば、見た目エラーにはなりませんが、これではBitmap~自体が意味をなしません。    他にも方法はあるかもしれませんが、Color構造体どおしをArgbに変換して比較するとうまく判定できるはずです。黒だったら、 If System.Drawing.Color.Black.ToArgb() = Bitmap.GetPixel(1, 1).ToArgb() Then で、取得した色が同じく黒だったら、Trueを返します。  この場合の黒は「A=255,R=0,G=0,B=0」です。見た目黒でも引っかかってこない場合は、ARGB値を変えるか、幅を持たせる必要があるでしょう。    

kisisuku
質問者

お礼

ご返事ありがとうございます^^ このプログラムを組み込んで見たところ、組み込んだ部分のBitmap.GetPixelの部分が波線となりエラーになってしまいました。心当たりがございましたらぜひとも返信をお願いいたします。

すると、全ての回答が全文表示されます。
  • mo_gu
  • ベストアンサー率51% (56/109)
回答No.1

Bitmapはあまり使わないのでわからないことが多いのですが 怪しそうなところをあげてみます。 If CHECK_C = Val("Bitmap.GetPixel(x,y)") Then Valのところを変更してみてください。 If CHECK_C = Val(Bitmap.GetPixel(x,y)) Then GetPixelはcolor構造体を返しますけど Valでチェックしたい色が取れるのでしょうか?

kisisuku
質問者

お礼

アドバイスありがとうございます。 改良後、また掲示いたしますので、御助言お願いいたします。  初心者に近いので詳しくは伝えられませんが、白黒の判別がうまくいかないだけで%ではしっかりと読み込んでいるようでした。  自分の作っているプログラム以外にVB.NETで白黒を判別する方法がありましたら、ヒント、もしくは助言のほどお願いいたします。

すると、全ての回答が全文表示されます。