プログラミング演習Ⅲ(2023)

【課題8-06】複数の円を描く(加点)

プロジェクトタイプC#コンソールアプリ※
プロジェクト名Prac_8_06
ソリューション名PET8
ターゲットフレームワーク.NET 6.0 (長期的なサポート)
最上位レベルのステートメントを使用しない使用しない(チェックオン)

※ 「コンソールアプリ(.NET Framework)」ではないので注意せよ!

指定された 複数の円 を描いた画像ファイルを生成するプログラムを作成せよ.

注意

C#で画像を扱う方法

表示するにはここをクリック

C#で画像を扱う方法はいくつかあるが,ここではSkiaSharpという ライブラリを使用する方法を紹介する.

このライブラリをプロジェクトにインストールして以下のように書くと,実行ファイルと同じ場所に output.pngという赤一色の画像ファイルが作られる(このプログラムを実行するには後述するプロジェクトの設定が必要である).

画像を生成するプログラム
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using SkiaSharp; // 追記

namespace Prac_8_06
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 画像を作る(512 x 512 ピクセル)
            SKBitmap img = new SKBitmap(512, 512);

            for (int y = 0; y < img.Height; ++y) 
            {
                for (int x = 0; x < img.Width; ++x) 
                {
                    // 描画色を赤(RGB=〈255,0,0〉)にする
                    SKColor color = new SKColor(255, 0, 0);

                    // 画像の座標(x, y)の位置のピクセルを↑の色で塗る
                    img.SetPixel(x, y, color);
                }//for
            }//for

            // 生成した画像を output.png という名前でファイルに保存する.
            using (Stream file = File.Open("output.png", FileMode.Create))
            {
                img.Encode(file, SKEncodedImageFormat.Png, 0);
            }//using        

        }// end of Main()
    }// end of class Program
}// end of namespace

SkiaSharpを使用するためには以下の手順を行えばよい.

  • 【手順】SkiaSharpのセットアップ手順
    1. C#の「コンソールアプリ」タイプのプロジェクトを用意する(_)
    2. ソリューションエクスプローラー上で設定を行うプロジェクトを右クリックして,「NuGetパッケージの管理」をクリックする(_).
    3. 「参照」をクリックして検索欄に「SkiaSharp」と入力する.「SkiaSharp」が検索されるので1,画面右側の「インストール」ボタンをクリックする(_).
      • この際いくつか確認が表示されるので「OK」など肯定的な選択を行う(__).
    4. ボタンが「アンインストール」に変わったらインストール完了である(_).
SkiaSharpのセットアップ

以上のセットアップを行い_のプログラムを書き込んで実行すると画像が生成されファイルに保存される. 保存された画像ファイルを確認するには以下の手順を行う.

  • 【手順】出力画像の確認方法
    1. Main()メソッドにプログラムを書きこんで実行する(_).
      • コンソールには何も表示されない(正常な動作).この画面は閉じてもよい(_).
    2. ソリューションエクスプローラー上で実行したプロジェクトを右クリックして,「エクスプローラーでフォルダーを開く」をクリックする(_).
    3. エクスプローラーの画面が開くので「bin」→「Debug」→「net6.0」とナビゲートする(_(4)~_).
    4. プログラム内の img.Save(...) メソッドに渡した文字列同じファイル名の画像ファイルが作られている(_).
      • この画像ファイルを開くと,サンプルの通り書いていれば赤く塗りつぶされた画像が表示されるはずである(_).
生成された画像ファイルの確認方法

詳しい操作方法が分からない場合は,_の動画を参考にするとよい23

SkiaSharpライブラリをプロジェクトに追加するための設定
表示するにはここをクリック : 閉じる

_をベースとして,_のような 複数の円を描いた画像を生成するプログラムを作成せよ. 画像サイズは_の通り縦横512×512ピクセルで固定とする.

複数の円

このために_のように,円の情報を表すクラスCircleInfoと定数を用意すること. _には,このクラスの配列circlesがあらかじめ用意されている. この配列に含まれているすべての円を描くようにすること.ピクセルが複数の円に含まれる場合は, この配列内のより先頭に近いほうの円を優先して描くこと.

あらかじめ用意するクラス・定数
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
namespace Prac_8_06
{
    // 円の情報
    class CircleInfo 
    {
        public int CenterX { get; set; } // 円の中心位置の x 座標
        public int CenterY { get; set; } // 円の中心位置の y 座標
        public int Radius { get; set; } // 円の半径
        public SKColor FillColor { get; set; } // 塗りつぶし色
        
    }// end of CirecleInfo

    internal class Program
    {
        // 描くべき円の情報の配列
        public static readonly CircleInfo[] circles = new[]
        {
            new CircleInfo(){ CenterX = 100, CenterY = 120, Radius =  80, FillColor = new SKColor(211,  76,  44) },
            new CircleInfo(){ CenterX = 220, CenterY =  80, Radius =  60, FillColor = new SKColor(237, 209, 135) },
            new CircleInfo(){ CenterX = 255, CenterY = 255, Radius = 100, FillColor = new SKColor(251, 201,  62) },
            new CircleInfo(){ CenterX = 300, CenterY = 350, Radius =  50, FillColor = new SKColor(215, 192,  80) },
            new CircleInfo(){ CenterX = 120, CenterY = 400, Radius = 110, FillColor = new SKColor(116,  22,   0) },
            new CircleInfo(){ CenterX = 410, CenterY = 380, Radius =  55, FillColor = new SKColor(253, 240, 182) },
            new CircleInfo(){ CenterX = 350, CenterY = 160, Radius = 120, FillColor = new SKColor(108, 162, 195) },
        };
        
        private static readonly SKColor BackColor = new SKColor(176, 67, 105); // 背景色

        static void Main(string[] args)
        {
            // 画像を作る(512 x 512 ピクセル)
            SKBitmap img = new SKBitmap(512, 512);

            for (int y = 0; y < img.Height; ++y)
        // ... 以下省略 ...

ヒント

なし


  1. 検索結果に表示されるアイコンはバージョンなどによって異なるので注意せよ.必ずしも_と全く同じ表示となるわけではないので名前をよく見て適切なライブラリを選択すること. ↩︎

  2. Apple社の都合により,iPhone,iPadなどのデバイスでは動画の再生はできません(Apple社はスマートフォン/タブレット製品で,意図的?にVPxやAV1コーデックのサポートを遅らせているため.参考1参考2). ↩︎

  3. Microsoft Edge で動画を閲覧するためには,AV1 Extensionをインストールする必要があります. ↩︎

Last updated on 2023-12-06
Published on 2023-12-06

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.