C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 線のみ削除


(過去ログ 21 を表示中)

[トピック内 19 記事 (1 - 19 表示)]  << 0 >>

■8378 / inTopicNo.1)  線のみ削除
  
□投稿者/ ゆう (1回)-(2007/09/28(Fri) 15:13:50)

分類:[C#] 

2007/09/28(Fri) 15:18:21 編集(投稿者)

はじめまして

C#でペイント的なプログラムを作成しています。

現在はペンカーソルでクリックイベント等を用いて書いた直線と読み込んだ画像をpictureboxに表示できます。

そして消しゴムカーソルにて画像のみ残してペンで書いた部分は消したいのですが可能でしょうか。

それを行うには、どうしたらよろしいでしょうか。

可能であればpicturebox内で処理したいです。
よろしくお願いします。
引用返信 編集キー/
■8384 / inTopicNo.2)  Re[1]: 線のみ削除
□投稿者/ 渋木宏明(ひどり) (412回)-(2007/09/28(Fri) 15:36:57)
渋木宏明(ひどり) さんの Web サイト
2007/09/28(Fri) 15:49:41 編集(投稿者)

> それを行うには、どうしたらよろしいでしょうか。

いわゆる「レイヤー」みたいな仕組みを自作するか、そういういっさいがっさいの機能を備えたコントロールをどこかから探してきて使うか、とかになります。
将来的にレイヤー機能が必要になるようなら、今のうちに調達してしまった方が話が早いです。

そんな予定は全然無くて、「絵の上に描いた線が消せればいい」ということなら、画像を別途読み込んで、「消しゴムをかけた範囲」に別途読み込んだ画像の「その範囲の画像」を Graphics.DrawImage() 等で部分的に描画してやれば実現可能です。

> 可能であればpicturebox内で処理したいです。

無理です。PictureBox は「画像を表示する」程度のことしか出来ません。

引用返信 編集キー/
■8390 / inTopicNo.3)  Re[1]: 線のみ削除
□投稿者/ IIJIMAS (33回)-(2007/09/28(Fri) 15:57:36)
No8378 (ゆう さん) に返信
> 2007/09/28(Fri) 15:18:21 編集(投稿者)
>
> はじめまして
>
> C#でペイント的なプログラムを作成しています。
>
> 現在はペンカーソルでクリックイベント等を用いて書いた直線と読み込んだ画像をpictureboxに表示できます。
>
> そして消しゴムカーソルにて画像のみ残してペンで書いた部分は消したいのですが可能でしょうか。
>
> それを行うには、どうしたらよろしいでしょうか。
>
> 可能であればpicturebox内で処理したいです。
> よろしくお願いします。

ご自分作られた(作られる)アプリの図形なら、描くタイミングで座標を記録して内部で図形
たとえば
GraphicsPath クラス
http://msdn2.microsoft.com/ja-jp/library/system.drawing.drawing2d.graphicspath(VS.80).aspx
のコレクションを保持して、実際の画面(コントロール)にはそれと読み込んだ画像(背景の画像?)を
Paintイベント
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.paint(VS.80).aspx
のハンドラですべて描画するようにすればよいと思います。
Graphics クラス
http://msdn2.microsoft.com/ja-jp/library/system.drawing.graphics(VS.80).aspx
関連を使用します。

消すのはコレクションから削除すればいいと思います。
消すときなどの図形の選択などには
GraphicsPath.IsVisible メソッド
http://msdn2.microsoft.com/ja-jp/library/system.drawing.drawing2d.graphicspath.isvisible(VS.80).aspx
が使えるのではと思います。

引用返信 編集キー/
■8391 / inTopicNo.4)  Re[2]: 線のみ削除
□投稿者/ ゆう (2回)-(2007/09/28(Fri) 15:59:32)
ありがとうございます。

レイヤー機能が必要になってくるようです。
少し調べてみましたけど実装が、かなり難しそうですね…
Visual StudioのC#とレイヤーの連携でお勧めのサイト等ありましたら、ご教授願います
引用返信 編集キー/
■8393 / inTopicNo.5)  Re[2]: 線のみ削除
□投稿者/ ゆう (4回)-(2007/09/28(Fri) 16:07:48)
ありがとうございます。

当方、初心者なのでレイヤーでの実装が困難な場合、参考にさせていただきます。
引用返信 編集キー/
■8400 / inTopicNo.6)  Re[3]: 線のみ削除
□投稿者/ 渋木宏明(ひどり) (416回)-(2007/09/28(Fri) 16:32:49)
渋木宏明(ひどり) さんの Web サイト
> レイヤー機能が必要になってくるようです。
> 少し調べてみましたけど実装が、かなり難しそうですね…

作るとなるとちょっとメンドクサイですね。

> Visual StudioのC#とレイヤーの連携でお勧めのサイト等ありましたら、ご教授願います

Tips 系のサイトとか全然見ない人なので (^^;

「レイヤー」の、原理的なところは自体はそれほど難しく無いんですけどね。

# 時期未定ですけど、勉強会のネタ用にそのうちサンプル書くかもしれません。

引用返信 編集キー/
■8401 / inTopicNo.7)  Re[2]: 線のみ削除
□投稿者/ 渋木宏明(ひどり) (417回)-(2007/09/28(Fri) 16:36:09)
渋木宏明(ひどり) さんの Web サイト
> ご自分作られた(作られる)アプリの図形なら、描くタイミングで座標を記録して内部で図形

Undo/Redo を考慮してこういう実装を採ったりもしますが、この方式は描画する「ブツ」が増えると再描画がリニアに重くなります。

純粋なペイント系ではあんまりやらないんじゃないかな?

引用返信 編集キー/
■8402 / inTopicNo.8)  Re[4]: 線のみ削除
□投稿者/ ゆう (5回)-(2007/09/28(Fri) 16:38:50)
ありがとうございます。

http://bbs.wankuma.com/index.cgi?mode=al2&namber=7596
は拝見しました。C#初心者には難しい><
色々と調べてみたいと思います。
サンプル楽しみです☆
引用返信 編集キー/
■8426 / inTopicNo.9)  Re[5]: 線のみ削除
□投稿者/ 渋木宏明(ひどり) (425回)-(2007/09/29(Sat) 07:23:47)
渋木宏明(ひどり) さんの Web サイト
> サンプル楽しみです☆

レイヤーの実装だけでよければこんな感じです。

http://hidori.jp/downloads/junktest/TestLayer-20070929.zip

線とか消しゴムの実装は自分で考えてみてください。

線は特に難しいことは無いでしょう。
選択されてるレイヤーのビットマップに、今やってるのと同じように書き込めばOKなはず。

消しゴムは、普通のペイント系だと、選択されているレイヤーのビットマップの「消しゴムをかけた領域」を透明色で塗りつぶしてるだけのものが多いはず。

引用返信 編集キー/
■8722 / inTopicNo.10)  Re[3]: 線のみ削除
□投稿者/ ゆう (8回)-(2007/10/09(Tue) 10:08:35)
ありがとうございます☆

参考にさせていただきます!
引用返信 編集キー/
■8726 / inTopicNo.11)  Re[6]: 線のみ削除
□投稿者/ ゆう (9回)-(2007/10/09(Tue) 10:18:14)
ありがとうございます☆

参考にさせていただきます!

引用返信 編集キー/
■8788 / inTopicNo.12)  Re[6]: 線のみ削除
□投稿者/ ゆう (16回)-(2007/10/10(Wed) 11:12:25)
> 消しゴムは、普通のペイント系だと、選択されているレイヤーのビットマップの「消しゴムをかけた領域」を透明色で塗りつぶしてるだけのものが多いはず。

消しゴム処理を実装してみましたが透明色で塗りつぶすと透明で塗られるので元の線が消えずに、そのまま残ってしまいました…
引用返信 編集キー/
■8791 / inTopicNo.13)  Re[7]: 線のみ削除
□投稿者/ 渋木宏明(ひどり) (457回)-(2007/10/10(Wed) 12:18:33)
渋木宏明(ひどり) さんの Web サイト
> 消しゴム処理を実装してみましたが透明色で塗りつぶすと透明で塗られるので元の線が消えずに、そのまま残ってしまいました…

どこ(≒どのレイヤー)を透明色で塗りつぶしたんですか?
線の描かれたレイヤーを操作しないと意味をなさないのは分かりますよね?

引用返信 編集キー/
■8796 / inTopicNo.14)  Re[8]: 線のみ削除
□投稿者/ ゆう (17回)-(2007/10/10(Wed) 16:58:49)
はい、そのレイヤーに対して消しゴム処理をかけてますが透明色で上書きされるため元の線を消すことは出来ないようです。。
引用返信 編集キー/
■8801 / inTopicNo.15)  Re[7]: 線のみ削除
□投稿者/ めか (1回)-(2007/10/10(Wed) 19:06:36)
2007/10/10(Wed) 19:09:55 編集(投稿者)

No8788 (ゆう さん) に返信
>>消しゴムは、普通のペイント系だと、選択されているレイヤーのビットマップの「消しゴムをかけた領域」を透明色で塗りつぶしてるだけのものが多いはず。
>
> 消しゴム処理を実装してみましたが透明色で塗りつぶすと透明で塗られるので元の線が消えずに、そのまま残ってしまいました…

横合いから失礼します。
まだまだ初心者ですが、なんとなく思い当たったことがあるので…

もしかして、「透明な色」で塗りつぶしてたりしませんか…?
この場合の透明色は、いわゆる「背景色」もしくは、透過処理の対象の色だと思うのですが…

例:背景色が白の画面に黒で描く→消しゴムで消す ≒ 背景色(白)で塗る
  透過処理対象の色(よく見るのは#ff00ff(紫)ですかね。)の画面に黒で書く → 消しゴムで消す ≒ 透過対象の色で塗る

ハズしてたらごめんなさい。
引用返信 編集キー/
■8809 / inTopicNo.16)  Re[8]: 線のみ削除
□投稿者/ 渋木宏明(ひどり) (459回)-(2007/10/10(Wed) 22:05:05)
渋木宏明(ひどり) さんの Web サイト
>   透過処理対象の色(よく見るのは#ff00ff(紫)ですかね。)の画面に黒で書く → 消しゴムで消す ≒ 透過対象の色で塗る

.NET の Bitmap クラスはアルファチャンネルに対応しているので、「透過色」を使う必要はありません。

で、Bitmap クラスのアルファチャンネルを利用して重ね合わを行うのであれば、背景色で塗ってもイカンです。

例えば、「緑 (#ff00ff00)で塗りつぶされているところ」に「消しゴム」をかけるのであれば、「消しゴムをかけたところ」を「透明色(#00000000)で塗りつぶす」ばおkなのです。

引用返信 編集キー/
■8810 / inTopicNo.17)  Re[9]: 線のみ削除
□投稿者/ 渋木宏明(ひどり) (460回)-(2007/10/10(Wed) 22:32:29)
渋木宏明(ひどり) さんの Web サイト
> はい、そのレイヤーに対して消しゴム処理をかけてますが透明色で上書きされるため元の線を消すことは出来ないようです。。

なんとなく原因が分かった気がする。

この前書いたサンプルのコードを改造して使っているなら、「透明色で塗る」のはレイヤーの Bitmap 直でないと駄目ですぜ。(ついでに言えば線を描くのも)

画像ファイルの読み込みのとこが「あーなってる」のは、画像ファイルの縦横サイズがキャンバス(と各レイヤーの Bitmap)の縦横サイズと同じである保証はないので「あーなってる」ます。

引用返信 編集キー/
■8849 / inTopicNo.18)  Re[10]: 線のみ削除
□投稿者/ ゆう (19回)-(2007/10/11(Thu) 13:30:42)
> この前書いたサンプルのコードを改造して使っているなら、「透明色で塗る」のはレイヤーの Bitmap 直でないと駄目ですぜ。(ついでに言えば線を描くのも)

ありがとうございます。
ビットマップの場合、SetPixelで書くのでMouseMove時に再描画を実行しても、すべて反映しきれずに途切れ途切れになってしまいます。
引用返信 編集キー/
■8869 / inTopicNo.19)  Re[11]: 線のみ削除
□投稿者/ 渋木宏明(ひどり) (463回)-(2007/10/11(Thu) 22:15:55)
渋木宏明(ひどり) さんの Web サイト
> ビットマップの場合、SetPixelで書くのでMouseMove時に再描画を実行しても、すべて反映しきれずに途切れ途切れになってしまいます。

それ、別な問題ですよね?

Graphics.FromImage() で Bitmap から Graphics を作れば、そこに戦でも円でもかけますよ。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -