このページの最終更新 2008/09/14 |
Paint.NET公式サイト↓ |
マニュアルメニュー | TOP | 機能と使い方 | プラグイン | レタッチ例 | 効果使用例 | ギャラリー |
ゼロから作るオリジナルプラグイン |
5.線画の抽出プラグインを作る!(実用プログラム完成編) 前回はメインプログラムを作りました。あれだけだと、間違って2回かけてしまうと画像が変わってしまいます。元に戻すでもいいですが、余計な作業はしたくないですよね。消しゴム跡なども具合が悪いです。 何度も色々な条件でプログラムを動かして、具合の悪いところを修正していく。デバッグというのは、大体こんな作業です。開発バージョンではよく、Ver0.xxなんて書いてありますよね。正規品が出ても、Ver1.xxって修正の度に変わります。あれ、どうやってバージョン決めてるんですかね?前から不思議です。ま、開発者が勝手に付けてると思ってますが(笑) このプラグインの場合、白黒はVer.0.1、カラー対応でVer.0.5、今回がVer1.0を目指すってところでしょうか?(笑) それから前回ちょっと説明しましたけど、こんな簡単なプログラムでも何万回も繰り返し処理をします。できるだけ必要ない処理はさせたくないですよね。不要な処理をさせないで実行速度を上げる、これがプログラマーの腕の見せ所です。 で、今回付け加える事は ●処理済みの画像だったら、クリックしても変化しない。 ●画像のピクセルが背景色だったら、メインプログラムを使わずに透明にする ●消しゴム等の後が残っていたら、透明にする。 (1)フローチャートで考えてみよう 日本語プログラムは一連の作業の覚え書きでしたが、条件が色々あると言葉だけでは分かりづらいですよね。こんな時フローチャート「流れ図」を使ってプログラムの概要を書くと分かりやすいです。正式にはJISで決められた書式があるのですが、ココでは簡単に四角と楕円で表しましょう。(楕円のところはホントはひし形なんだけど、描くのがめんどくさかったので(^^;)) 右は2回目で作った色塗り変換のプログラムを簡単なフローチャートで表したものです。真ん中のYesNoがif文です。全部日本語で書いてますが、本来は実行する式などを書きます。今はどちらでも良いでしょう。 ココではごちゃ混ぜでいきます(笑) 右が最終的な線画抽出プラグインのフローチャートです。 なんか、プログラムっぽいでしょ?(笑) 青い部分は元々あるサンプルプログラムを利用した部分です。 紫のメインプログラムは前回作ったヤツですね。 で、それに緑と黄色のプログラムを足すわけです。 緑色の所は「YESなら、青へ行き、NOなら黄色のブロックに行きなさい」 黄色の所は「YESなら、A=0 の処理をして緑のブロックへ戻りなさい。NOなら紫のブロックに行きなさい」緑のブロックへ戻ると、後は何も処理が無いので、青のブロックへ戻ります。 紫色の所は「処理したら黄色のブロックに戻りなさい」黄色のブロックへ戻っても処理は何もありません。黄色から緑に戻っても何も処理は有りません。従って青のブロックへ戻ります。 と言うわけです。こういうの、入れ子構造っていいます。 サンプルプログラムを見ると、{ が出てきて、その位置がだんだんずれて、今度は } が出てきて位置が元に戻っていきますよね。 {}で囲まれた部分を一つのブロックにしてるわけです。つまり、色分けしたブロックを{}で囲んでやるといいわけですね。 {}の位置は別にずらさなくても良いのですが、ずらした方が見やすいし、どこからどこまでが一つのブロックになってるか分かりやすくするためです。 (2)フローチャートに従ってプログラムを書こう 前回、if文の論理積を覚えましたが、今度は論理和を使います。論理和というのは、OR、つまり、「または」というヤツです。 if ( A | B) C 「もし、A または B なら Cの処理をしなさい」 |がORにあたります。これを二つ続けて || と書くと、意味は同じなんですが、なんと、Aの条件を満たしたとき、Bなんかすっとばして、Cの処理をするそうです。もし、条件がA or B or C or ・・・って沢山あるときは、どれか、一つでも当てはまれば良いわけですから、全部チェックする必要が無いわけですよね。そういうとき重宝します。 if ( A || B) C 「もし、A または B なら Cの処理をしなさい(Aの条件が成立したらBはチェックしない)」 それから、今回はif文でelseを使いました。 if ( A ) B else C 「もし、A なら Bの処理を、A以外なら Cの処理をしなさい」 elseを使わなくてもプログラムできますが、沢山の処理をするときは、elseを使い処理内容を{}で囲むと、理解しやすいです。この場合は、位置をずらさないほうが良いかと・・・思ってます。まっ、自分が見やすければどうだって良いと思いますけど(爆)上級者のプログラムを参考に見やすいプログラム作りを心がけましょう! 以下が完成プログラムです。前回同様、コピペして、試してみてください。ちゃんとこのシリーズ見てくれてる人なら、サンプルのどこを消して、どこへコピーすれば良いか分かりますよね。 |
CurrentPixel = src[x,y]; if ((CurrentPixel.R != PrimaryColor.R)||(CurrentPixel.G != PrimaryColor.G)||(CurrentPixel.B != PrimaryColor.B)) { if ((CurrentPixel == SecondaryColor)||(CurrentPixel.A < 255)) { CurrentPixel.A = 0; } else { double dcsr = (CurrentPixel.R - SecondaryColor.R); double dcsg = (CurrentPixel.G - SecondaryColor.G); double dcsb = (CurrentPixel.B - SecondaryColor.B); double dpsr = (PrimaryColor.R - SecondaryColor.R); double dpsg = (PrimaryColor.G - SecondaryColor.G); double dpsb = (PrimaryColor.B - SecondaryColor.B); double rar = 0; double rag = 0; double rab = 0; if (dpsr != 0) rar =(255*(dcsr/dpsr)); if (dpsg != 0) rag =(255*(dcsg/dpsg)); if (dpsb != 0) rab =(255*(dcsb/dpsb)); int ra = 0; if ((rar != 0)&(rag != 0)&(rab != 0))ra = (byte)((rar+rag+rab)/3); if ((rar != 0)&(rag != 0)&(rab == 0))ra = (byte)((rar+rag)/2); if ((rar != 0)&(rag == 0)&(rab != 0))ra = (byte)((rar+rab)/2); if ((rar != 0)&(rag == 0)&(rab == 0))ra = (byte)(rar); if ((rar == 0)&(rag != 0)&(rab != 0))ra = (byte)((rag+rab)/2); if ((rar == 0)&(rag != 0)&(rab == 0))ra = (byte)(rag); if ((rar == 0)&(rag == 0)&(rab != 0))ra = (byte)(rab); CurrentPixel.A = (byte)ra; CurrentPixel.R = (byte)PrimaryColor.R; CurrentPixel.G = (byte)PrimaryColor.G; CurrentPixel.B = (byte)PrimaryColor.B; } } dst[x,y] = CurrentPixel; |
もし、気に入ったらアイコンを作ってオリジナルプラグインにしてくださいね! ■今回のまとめ ●フローチャートでプログラムを視覚的に分かりやすくする ●if ( A | B) C 「もし、A または B なら Cの処理をしなさい」 ●if ( A || B) C 「もし、A または B なら Cの処理をしなさい(Aの条件が成立したらBはチェックしない)」 ●if ( A ) B else C 「もし、A なら Bの処理を、A以外なら Cの処理をしなさい」 以上で、ワンクリックプラグインの作り方の解説はお終いです。今回までで、自分でも勉強しながらプラグイン作りの基本、プログラムの基本を説明したつもりです。ど素人なのに、だんだん偉そうな解説になってしまいましたが(昔、色々勉強したことが蘇ってきたので・・・)(^^;)。ここで解説したことは、本当にプログラムの入口です。興味を持って貰えたらいいなぁという気持ちで書きました。興味が湧いたら、是非、本格的に勉強してみてください。 後2回で終了予定です。次回はついにUIの作成!!またサンプルを使ったUI作りの体験です。最終回は、例によって一行?で作るUI付きプラグインの作成です(^o^) 前の記事に戻る 目次へ戻る 次の記事へ進む |