• ベストアンサー

画像の座標取得

VBのPictureBoxでピクチャーを表示し、指定したカラーの座標(X,Y)を配列で取得する方法はありますか? 例えば、真っ黒の中に白い点が散りばめられている画像を読み込んだとして、ピクチャー上に白で表示されている部分のXY軸を取得し、座標計算等を行おうとしています。 上記方法以外でも良い方法があればお願いします。 画像自体が大きいので、出来るだけ早い処理で取得出来るものをと考えています。

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

  • ベストアンサー
  • hawkwind
  • ベストアンサー率34% (160/469)
回答No.2

すみません。ちょっと勘違いがありました。 >指定したカラーの座標(X,Y)を配列で取得する方法が処理の内容でしたが、 これを単にカラーの座標(X,Y)を配列で取得する方法と受け取ってしまいました。 指定した座標の色をPictureBox上で取得するにはGetPixcelとかの関数があります。 これで1点1点比較していき、指定したカラーと一致するものを 配列に待避させていけばいいかと思います。 ただ、既にGetDIBitmapsを使っておられるとのことなので、 今後も本格的な画像処理プログラミングを考えているのなら、 このままGetDIBitmapsを使えばいいかとも思います。 >どうも実際のPictureのXYとは違い、 >独自の配列を持っているようで圧倒的にPictureの方が大きくなります。 実際のPictureのXYとは違い、配列の方は上下反転しています。 また、配列はバイトで宣言していると思いますが、 フルカラーの場合は1点につき4バイトなので配列の大きさも4倍になります。 圧倒的にpictureの方が大きくなりますの意味がちょっとよく分かりません。

o_teu
質問者

お礼

hawkwindさん回答有難うございます。 PictureとGetDIBitmapsの誤差の正体が分かりました。 ScaleをTwipsPerPixelXで割っていたのに、実際のPictureのXY座標に当てはめるときにTwipsPerPixelXで掛けるのを忘れていました。 また、配列は左右反転になっていたようです。 全体的な処理も想定しているような動作になってきているので一安心といったところです。 ありがとうございました。

その他の回答 (2)

  • hawkwind
  • ベストアンサー率34% (160/469)
回答No.3

すみません。ちょっと勘違いがありました。 >指定したカラーの座標(X,Y)を配列で取得する方法が処理の内容でしたが、 これを単にカラーの座標(X,Y)を配列で取得する方法と受け取ってしまいました。 指定した座標の色をPictureBox上で取得するにはGetPixcelとかの関数があります。 これで1点1点比較していき、指定したカラーと一致するものを 配列に待避させていけばいいかと思います。 ただ、既にGetDIBitmapsを使っておられるとのことなので、 今後も本格的な画像処理プログラミングを考えているのなら、 このままGetDIBitmapsを使えばいいかとも思います。 >どうも実際のPictureのXYとは違い、 >独自の配列を持っているようで圧倒的にPictureの方が大きくなります。 実際のPictureのXYとは違い、配列の方は上下反転しています。 また、配列はバイトで宣言していると思いますが、 フルカラーの場合は1点につき4バイトなので配列の大きさも4倍になります。 圧倒的にpictureの方が大きくなりますの意味がちょっとよく分かりません。

  • hawkwind
  • ベストアンサー率34% (160/469)
回答No.1

>指定したカラーの座標(X,Y)を配列で取得する方法はありますか? DIBとして配列に読み込みます。使うのはGetDIBitmapsです。 かなり難易度の高いAPIなので本を一冊購入するぐらいで臨んで下さい。 >画像自体が大きいので、 >出来るだけ早い処理で取得出来るものをと考えています 画像が大きいものを早く処理したいのですか? 処理にもよりますがフィルタですとVBだと30秒前後かかります。 私どものところでも実績はありますが、 画像処理ではC言語を使ってDLLというのが普通です。 処理が単純なら平凡にPictureBoxの縦横をFor文で回した方が楽です。 どうしても早さを求めるとなると、その勉強だけで1、2週間はとびますから。

o_teu
質問者

お礼

hawkwindさん、早速回答有難うございます。 GetDIBitmapsは使用しております。ネット上で紹介されている方法をチラッと参考にした程度なので、使用方法が正しいかどうかは分かりませんが、どうも実際のPictureのXYとは違い、独自の配列を持っているようで圧倒的にPictureの方が大きくなります。 そこで、Picture / GetDIBitsの最大値 の結果をGetDIBitsで取得した配列の座標に掛けたのですが、誤差が出てしまいました。 現在の対策は実際のPictureをFor文で回す。を分割処理で、結果を得られればループ終了。のような事を考えています。

関連するQ&A