DOBON.NET DOBON.NETプログラミング掲示板過去ログ

色の比較をしたい

環境/言語:[VB.net basic 2003/win2k]
分類:[.NET]

初めまして、最近プログラムを作れと言われ始めたのですが、行き詰まり困ってます。
あちこち調べているうちにここに行き着きました。智恵をお貸し頂きたいと思います。

あるビットマップファイル(以下bmp)に含まれる特定の色の量を調べたいのです。
要はbmpに赤が何点含まれるのかを数えたいのです。
bmpから1pixcelずつ色を取り出し、それが赤と同じであるか判別し、
全領域でそれを行おうとしました。

    Dim B As Bitmap
    Dim Temp as object
    Temp=B.GetPixel(0, 0) :(0,0)は取得する色のbmp上座標
        ^^^^^^^^^^^^^^ 
結果色情報の取得は上式で行いました。ところが得られる色情報(式中のTemp)の
使い方がわかりませんでした。色情報は式の中では使えないと言われました。
If Temp=RGB(255,0,0) Then  ←こういうのがどうしてもできません(涙)


それで質問させてください

1: ここで得られる色情報(Temp)とはどんな値(?)なんでしょうか?
   tempからもしかしてRGBのように色の成分を取り出したりとか
   できるのでしょうか?

2: どうにかして色通しを比較する方法はないでしょうか?
   とりあえずこれができればいいんですが・・・

3: (ついでで恐縮なんですが)
   でかいbmpを読み込むとメモリが足りないといわれます
   どうにかしたいのですが・・・
   物理メモリを増設してもやっぱり意味ないですよね?
   
どんなのでもいいので、助言いただければうれしいです。
説明が下手で申し訳ありませんが、どうぞよろしくお願いします。
Dim Temp as object

Dim Temp as Color
に。

ColorをなんでObjectで宣言するかな。
Colorは構造体だから値型ですよ。
参照型で宣言されたTempに代入するたびにボクシング、読み込むたびに逆ボクシングされてとてもパフォーマンス悪そうですけど。
1、2回なら目をつむりますけど、メモリに読めないほどの画像ですからね。
レスありがとうございます。大変参考になります。(ほんと助かりました♪)
完全に独学なのと、参考書も少ないので載っていないこととかは
結構な常識でも、わからないことが多いです。

objectは何でも入るといった認識だったので型がわからないこともあって
使用しておりました。colorってこういう物なんですね。
今まで全く見えてませんでした。ご指摘ありがとうございました。


1  ところでご指摘にあるように私はデータの読みこみに時間がかかります。
  毎回読み出しているからだと思いますが、どうすればさくさくいくのでしょう?
  宣言する場所が違うのですか?それともちょっと難しい作業がいるのでしょうか?

2  またデータをメモリ上に置いておくことはできないのでしょうか?
  ここで言うメモリとはCPUのキャッシュ?、物理メモリ?、
  それともアプリの使うメモリ空間ってやつ?なんでしょうか?
  なんかよくわかっておりません。日本語も変になってしまいましたが、
  なにか一言おねがいできないでしょうか。

最初のスレッドの趣旨から少しずれますが、アドバイス頂ければ幸いです。
■No2212に返信(勇敢な人さんの記事)
> If Temp=RGB(255,0,0) Then ←こういうのがどうしてもできません(涙)

ここで問題なのは、Color構造体にはRGBの色情報の他に、透明度を表すアルファ値があるということです。つまり、B.GetPixel(0, 0)が赤かを判断するには、アルファ値以外の値を調べるということになります。これは例えば次のように書けます。

Dim Temp As Color = bmp.GetPixel(x, y)
If (Temp.R = 255 And Temp.G = 0 And Temp.B = 0) Then
...

> 1  ところでご指摘にあるように私はデータの読みこみに時間がかかります。
>   毎回読み出しているからだと思いますが、どうすればさくさくいくのでしょう?
>   宣言する場所が違うのですか?それともちょっと難しい作業がいるのでしょうか?
>
> 2  またデータをメモリ上に置いておくことはできないのでしょうか?
>   ここで言うメモリとはCPUのキャッシュ?、物理メモリ?、
>   それともアプリの使うメモリ空間ってやつ?なんでしょうか?
>   なんかよくわかっておりません。日本語も変になってしまいましたが、
>   なにか一言おねがいできないでしょうか。

違う画像を読み込むのであれば、毎回読み込むのは仕方ないでしょう。また、Bitmapに画像を読み込んだ時、これはすでにメモリにあるといえます。
管理人さん自らのレスありがとうございます。感激です。
タイトルの通り解決致しました。

> Dim Temp As Color = bmp.GetPixel(x, y)
> If (Temp.R = 255 And Temp.G = 0 And Temp.B = 0) Then

↑まさに私の知りたいことはこれでした♪

舌足らずの私の質問に、最後までお付き合い頂き、本当にありがとうございました。
これから私も、皆さんのようになれるよう、勉強していきたいと思います。
またお会いすることがあれば、そのときはよろしくお願いします。
それでは!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板