チェック柄画像作成プログラム(3)

 ほぼ日常。

土日に参加するイベントないので、時間あるなぁ、と思って、平日はイラスト描くのとTRPGのシナリオを書いていたので、プログラムのほういじろうかな。と思って着手。(ニコ生ゲーのほうはどうした?)


タイトル、チェック柄になっているけど今回はチェック柄ではなく、以前からやりたいと思っていた、装飾の柄作成。

塗りつぶしの丸が段々と大きくなる柄。横でも右下でもあると良いアクセントになる。ただ、自分の手が描くと大きさが不揃いになったり、多くすると時間かかったり。でも繰り返しなのでプログラムのほうが得意です。

え?フリー素材でもアプリでもそんなこと出来るだろう?って?

それはそう。

でも自分で考えるのが好きというか、こういうこと考えることで脳を活性化しているようなものなのでね。あとそういう素材って自分の理想が100%だとすると100%の満点の素材ってなかなかないですからね。

まずバリエーションを考えます。

やりたいのは右下のほうに向かって丸が段々と大きくなる。

丸の密度、色、方向。

密度に関しては、今までのブロック概念を使い回せます。各ブロック内に丸を1つにし、サイズを右下に向かうたびに大きくする。

色に関しては、単色と2色。

方向は、上下左右斜め、と思いますが、画像は反転出来るので横と斜めあれば良いです。が、縦横の比率が1:1とは限らないので、縦、横、斜めにします。


はい、プログラムをVSで開きます。

えーっと、画像処理自体はそれぞれEditに入れているから、これだよな。これをコピーして…

あっ、bmp編集で1ドットずつ色指定していたのだった…

今回は丸を描くということで処理方法が違います。

丸を描くにはBitmapクラスに対してsetなんちゃらだっけ…、んー忘れたな。

こういうときは調べるよりAIだよ。少し前は調べろって感じだったけどね。

>C#でBitmap型で丸を描くコードをつくってください。

GraphicsクラスでdrawEllipseか。そんな感じだったな。

ループはブロック毎だから画像のサイズと入力値のブロックから出します。

ループ1:画像の幅÷ブロック幅の回数

ループ2:画像の高さ÷ブロック幅の回数

で描く位置をオフセットにし、

オフセット1:ループ1のループ数×ブロック幅

オフセット2:ループ2のループ数×ブロック幅

で、座標がオフセット1、オフセット2の位置に丸を描く。

ただ描く丸のサイズはループ数が少ないほど、小さくしたい。

どうするかを考えた結果、ブロックの最後である右下がブロック幅全体で丸になるとするとブロック幅×ループ数/最大ループ数がちょうど良いはず。

こんな感じ。あぁ、drawじゃ塗りつぶしじゃないよね?
drawEllipseじゃなくてfillEllipseだった。
修正して表示。

あれ??ほぼほぼ塗りつぶされてる…なんで??
右下だけ円になってて、それ以外が色1で塗りつぶされている。

うーん?
描くサイズ?

サイズの指定ってブロック幅に1未満になる数を掛けているから問題ないはずだよなぁ…、変えてみるが変わらず。

うーん?

あ、ころねさんの配信見ながら、コード書いてます。
エルデンリング初見配信。指指~。

じゃない、どうしてだ…?ちょこちょこ変えてみても結果変わらず。

うーん??


ん?サイズ?

このfillEllipseに渡しているサイズ、正しいのを確認した。でも描画が違う。

そう、引数の順番。1つ目はブラシだからいいとして、2,3番目に円の大きさ、4,5番目にオフセット、つまり画像を位置を指定している。

これはAIが「中心(100,100)、半径50の丸を描く」のコメントで、"drawEllipse(brush, 50, 50, 100, 100)"を指定していたからそうしたのだが、実際は「50,50の位置から直径100の丸を描く」だったのである。罠かよ。

半径50だから2,3番目がサイズやな。と思い込んでしまいました。

定義をみるとfillEllipse(Brush brush, int x, int y, int width, int height)。つまり2,3番目が座標、4,5番目が幅と高さ。

修正して再度表示。

うまくいったか…?いやなんか丸になってない。

右上と左下が楕円になっている。サイズを「model.HorizontalSize1 * x / wStepCount」、「model.VerticalSize1 * y / hStepCount」にしているがそれだと楕円になるな。真円以外いらないので、サイズは「ブロック幅×ループ1数/最大ループ1数×ループ2数/最大ループ2数」にしてみる。

うん、良さげ。

でもさ、なんか寄ってない?

オフセットを「x * model.HorizontalSize1」、「y * model.VerticalSize1」にしているのでブロック的にいうと、左上に寄る。列で見ると左寄せ、上付き状態。

それでもいいかな…と思いましたが、少しくらいは中央寄せにしたいな…と思い、修正。

丸を描画する位置であるオフセットの位置をさらに「ブロック幅の半分-丸のサイズの半分」の分ずらします。

表示結果
これで思い描いた通りです。
次に画面に方向を選択出来るようにし。

右方向
下方向
これで描画自体は問題なし。あと画面には色1と色2が設定出来るようになっているので、色2を利用します。
右方向の場合、縦に色が揃う、下方向の場合、横に色が揃う。
右でも下でも右下方向でも色交互もほしいかな。
using句で指定しているcolorをループ毎に変更。
右方向、下方向はループ数が偶数、奇数で色を指定。簡単ですね。

交互にするには…フラグ使って交互に1,2,1,2ってするか?
実装して表示してみると、列で同じ色になる。
そう、ループ数が偶数だと確かにそうなる。つまり画像サイズとブロック幅によってしまう。ループ1とループ2が両方偶数の場合と両方奇数の場合で色分け。
完成。
ころねさんもエルデンリングでボスを1体倒した。
この丸の画像作成を利用してもう1つくらい作るか…。
四角だと硬いイメージになっちゃうし、丸角の四角にするか。確か画像処理だと角の設定で丸めること出来たよな…?まぁ出来なくてもそのくらいならAIで作れるだろう。

~10分後~
よし、完成。表示。
うーん?違うね。
いや右下見ると違わないんだけど。合っているんだよ。
左上が四角になっていない。

予測だけど、角を丸くするために角度指定するのだが、サイズが足りていない。でもこの感じカッコいいから残そう。
そして角度を減らそう。(つまり丸みを少なくする)
サイズ小さい側がまだちょっと出ているけれどこれでいいか。
これで完成。一瞬だったな。
角度さらに大きくしたらどうなるんだ?
なんか面白い。これも残しておくか。
ということで4つ画像作成ツール出来ました。
ころねさんの配信がちょうど終わり。
これをそのまま背景にしてもいいし、背景の一部にするのもあり。
2,3時間の成果。





コメント

このブログの人気の投稿

日常(33)超かぐや姫!の考察

日常(30)推しの誕生日イベント

日常(21)ぺん誕2025の旅