- PR -

C# 領域の塗りつぶしについて

1
投稿者投稿内容
VitaminLemon
常連さん
会議室デビュー日: 2005/04/08
投稿数: 40
投稿日時: 2005-05-10 09:52
大変お世話になっております。
スレが長くなってしまったので別にスレを立ち上げました。
前回のスレでは本当に申し訳ないです。
前回のスレで質問したペイントルーツの機能実現については、
皆さんの助言のおかげでなんとか作ることができました。
※線・直線・曲線・四角(線・塗りつぶし)・楕円(線・塗りつぶし)
 矩形選択(移動・拡大・縮小)・スポイトなど
本当にありがとうございました。

前回同様、C#でペイントツールを作成しておりまして一つ問題がおきました。
ペイントで言う「塗りつぶし」を実現しようとしてちょっと躓いてしまいました。
MFC(VC++)で作成したときには
「ExtFloodFill」を使って選択したPixelから境界線(違う色)までの領域を塗りつぶす
ことをしていました。
この関数に似た機能の関数がないかと探してみたことろ
Javaまではほぼ同じ関数があるみたいなのですが、.NetではExtFloodFillは
ないと書かれていました。
何度調べましたが、やはり存在しませんでした。
Win32とAPIの対応表→ http://www.microsoft.com/japan/msdn/net/general/win32map.asp
ここにもやはり書かれていませんでした。
他に画面内の指定した色と同じ色のPexelを全て指定した色に変更する
(SetRemapTabl)なるものは存在しました。

そこで皆様のお力をお借りしたいのですが、
ペイントの「塗りつぶし」機能を実現しようとした場合に
どのように処理すれば実現できるのでしょうか???
指定座標からまわりを一つ一つ調べて色を変えていかないといけないのでしょうか?
何かいい方法があれば教えていただきたくスレを立ち上げました。

よろしくお願いします。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2005-05-10 12:43
Win32 APIを使用してもよいのならExtFloodFillをP/Invokeで呼ぶ。

.NET FrameworkのAPIのみで行いたい場合は、
 1. 塗りつぶし領域を取得する(矩形 or Region)
 2. 領域を指定色で塗りつぶす。
 3. 元の画像にコピーする。透過を考慮するならαブレンドする(Graphics#DrawImage)

ってとこかな? 

透過を考慮しないのなら、
 1. 塗りつぶし領域を取得する(矩形 or Region)
2. 塗る。(Graphics#FillRectangle, Graphics#FillRegion等)

でもいけそう。たぶん。

単なる思いつきなので、当てにはしないでネ。


[ メッセージ編集済み 編集者: かずくん 編集日時 2005-05-10 12:43 ]
VitaminLemon
常連さん
会議室デビュー日: 2005/04/08
投稿数: 40
投稿日時: 2005-05-11 09:45
かずくんさん返答ありがとうございます。

Win32APIは使用しないで作ってます。

で、かずくんさんの言っていた
>1. 塗りつぶし領域を取得する(矩形 or Region)
>2. 領域を指定色で塗りつぶす。
>3. 元の画像にコピーする。透過を考慮するならαブレンドする(Graphics#DrawImage)
なんですが、まず一番目の塗りつぶし領域を取得する方法がわかりません。

単に四角、楕円、多角形なきちんとした図形が描かれている場合は
どうにか取得してくることは可能かと思います。
そうではなくてマウスでクリックされたPicxelと同じ色のところから
違う色(境界線)がくるまで塗りつぶすという機能にしたい場合、
きちんとした矩形領域ではないので領域がうまく取得できません。
Win32のExtFloodFillでは関数が境界線まで勝手に塗りつぶしてくれていたので
その辺を考えなくてよかったのですが、.Netではこの関数が対応していなかったので
こまっております。

もう一度説明しますと、
矩形選択で塗りつぶし(四角・楕円など)は作ることはできます。
ただ、マウスでクリックされたPicxelからクリックされたPicxelの色と
違う色(境界線)がくるまで塗りつぶすという機能にしたい場合、
きちんとした矩形領域ではないので領域がうまく取得できません。
この場合、マウスでクリックされたPicxelと同じ色かどうかを
座標をPicxelずつずらして調べて同じ色だったら変更するみたいな処理を
自分でつくらないといけないのでしょうか???

前回のピクセルのつづりがすごいことになってました^^;
本当にすいませんでした。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2005-05-11 11:47
1ピクセルごとにチェックしながら、色を変更する例(非再帰版)
http://www.dotnet247.com/247reference/msgs/56/284738.aspx

こんなのしか見つからないですねぇ
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2005-05-11 11:53
Code Projectでこんなの見つけた
http://www.codeproject.com/cs/media/floodfillincsharp.asp
1

スキルアップ/キャリアアップ(JOB@IT)