非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

数学ゲーム(22)

中国の剰余定理パズル(9)

ChatGPT でアイコンの作り方を教えてもらいました。一つの画像のアイコンはできましたが複数の画像を持つアイコンの作り方はまだわかりません。今回は一つの画像のアイコンを使うことにしました。

アイコンは以下のようにしました。「ユークリッドの互除法」のように変数を置き換えて繰り返すイメージを  y = x^3 y = x^{12} のグラフを組み合わせて表したものです。

「中国の剰余定理パズル」のアイコン

準備ができたら公開する予定です。

以下は ChatGPT で調べた内容です。

Windows のアイコンの作り方を教えてください

と入力すると以下のような結果になりました。

Windows のアイコン(`.ico` ファイル)は、複数サイズの画像をまとめた形式です。
アプリケーション、ショートカット、フォルダーなどに使われます。

Windows アイコンの基本

Windows のアイコンには通常、複数の解像度が含まれます。

よく使われるサイズ:

  • 16×16
  • 24×24
  • 32×32
  • 48×48
  • 64×64
  • 128×128
  • 256×256

最近の Windows では 256×256 PNG 圧縮入り ICO がよく使われます。



方法1: 画像から `.ico` を作る(簡単)

手順

1. 元画像を作る

PNG 形式がおすすめです。

  • 背景透明にできる
  • 高画質
  • 編集しやすい

おすすめサイズ:

  • 256×256
  • 512×512



2. ICO に変換する

変換サイトやソフトを使います。

例:

PNG を読み込んで `.ico` で保存します。



方法2: GIMP で作る

画像編集ソフトの GIMP (https://www.gimp.org/?utm_source=chatgpt.com) を使う方法です。

手順

1. 新規画像作成
2. 透明背景にする
3. 絵を描く
4. 「ファイル」→「名前を付けてエクスポート」
5. `icon.ico` と入力
6. ICO 形式で保存

保存時に複数サイズを指定できます。



方法3: Visual Studio のアイコンエディタ

Visual Studio (https://visualstudio.microsoft.com/ja/?utm_source=chatgpt.com) にはアイコン編集機能があります。

手順

1. プロジェクトを開く
2. 「追加」→「新しい項目」
3. 「アイコンファイル」を選択
4. ドット単位で編集

Windows アプリ開発では便利です。



C# アプリにアイコンを設定する方法

WinForms / WPF

Visual Studio

1. プロジェクト右クリック
2. 「プロパティ」
3. 「アプリケーション」
4. 「アイコンとマニフェスト」
5. `.ico` を選択

EXE のアイコンになります。



C# でアイコンを読み込む

this.Icon = new Icon("icon.ico");

フォームのアイコンを変更できます。



アイコン作成のコツ

小さいサイズでも見やすくする

16×16 では細かい絵は潰れます。

良い例:

  • 太い線
  • シンプルな形
  • 強いコントラスト



背景透明を使う

透明背景 PNG → ICO にすると綺麗です。



複数サイズを入れる

Windows は状況によって自動選択します。



プログラムで ICO を作る

C# でも作れますが、ICO 形式は少し複雑です。

簡単には:

1. `Bitmap`
2. PNG 保存
3. ICO 変換ライブラリ使用

を行います。



アイコンデザイン例

よくある Windows アイコン:

  • フォルダー
  • 歯車
  • ターミナル
  • メモ帳
  • 数学記号
  • ツリー構造
  • 回路図

ユーザーの「構文木編集」「証明ゲーム」系のソフトなら、例えば:

  • 木構造アイコン
  • λ 記号
  • 数式ノード
  • パズルピース
  • グラフ構造

などが合いやすいです。



AI でアイコン画像を作る

最近は生成AIで:

  • ドット絵風
  • Windows 95風
  • フラットデザイン
  • 3D風

などのアイコン画像を作ってから ICO 化することも多いです。

プログラムで描画した画像を使いたいのでさらに質問してみました。

C# で ICO を作る方法を教えてください

と入力すると以下のような結果になりました。

C# で `.ico` ファイルを作るには、主に次の方法があります。

1. `Bitmap` を作る
2. ICO 形式で保存する

ただし、`.ico` は BMP や PNG より構造が複雑なので、
「バイナリを書き込む」か「ライブラリを使う」方法になります。



最も簡単な方法

PNG を作って ICO に変換

実用上はこれが簡単です。

using System.Drawing;

class Program
{
    static void Main()
    {
        Bitmap bmp = new Bitmap(256, 256);

        using (Graphics g = Graphics.FromImage(bmp))
        {
            g.Clear(Color.Transparent);

            g.FillEllipse(Brushes.Blue, 32, 32, 192, 192);

            g.DrawString(
                "C#",
                new Font("Arial", 48),
                Brushes.White,
                60,
                80);
        }

        bmp.Save("icon.png");
    }
}

これで PNG を生成できます。

その後 ICO 変換します。



C# だけで ICO を保存する方法

Windows ICO の最低限の構造を書き込みます。

以下は「1枚の32x32アイコン」を保存する簡易版です。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

class Program
{
    static void Main()
    {
        Bitmap bmp = new Bitmap(32, 32);

        using (Graphics g = Graphics.FromImage(bmp))
        {
            g.Clear(Color.Transparent);

            g.FillRectangle(Brushes.Red, 0, 0, 32, 32);

            g.DrawEllipse(Pens.White, 4, 4, 24, 24);
        }

        SaveAsIcon(bmp, "icon.ico");
    }

    static void SaveAsIcon(Bitmap bmp, string path)
    {
        using (MemoryStream pngStream = new MemoryStream())
        {
            bmp.Save(pngStream, ImageFormat.Png);

            byte[] pngBytes = pngStream.ToArray();

            using (BinaryWriter writer =
                   new BinaryWriter(File.Open(path, FileMode.Create)))
            {
                // ICONDIR
                writer.Write((short)0);     // reserved
                writer.Write((short)1);     // image type
                writer.Write((short)1);     // number of images

                // ICONDIR entry
                writer.Write((byte)bmp.Width);
                writer.Write((byte)bmp.Height);
                writer.Write((byte)0);      // color count
                writer.Write((byte)0);      // reserved

                writer.Write((short)1);     // color planes
                writer.Write((short)32);    // bits per pixel

                writer.Write(pngBytes.Length);

                writer.Write(6 + 16);       // offset

                // image data
                writer.Write(pngBytes);
            }
        }
    }
}

これで `icon.ico` が生成されます。



ICO ファイル構造

ICO は:

  • ヘッダー
  • エントリ一覧
  • 画像データ

から構成されます。

ICONDIR

2 bytes  reserved
2 bytes  type
2 bytes  image count



ICONDIRENTRY

1 byte   width
1 byte   height
1 byte   color count
1 byte   reserved
2 bytes  planes
2 bytes  bit count
4 bytes  image size
4 bytes  offset



複数サイズを含む ICO

Windows アイコンは普通:

  • 16x16
  • 32x32
  • 48x48
  • 256x256

などをまとめて入れます。

C# で作るなら:

List<Bitmap>

を順番に ICO に書き込みます。



Windows Forms でアイコンを作る例

構文木エディタのようなアプリなら:

g.DrawRectangle(...)
g.DrawLine(...)

で:

  • 木構造
  • ノード
  • 数式
  • グラフ

などを描いて ICO にできます。



ドット絵風アイコン

16x16 のアイコンはドット絵感覚で作ると綺麗です。

bmp.SetPixel(x, y, Color.Black);

で1ピクセル単位で描画できます。



高品質アイコンを作るコツ

256x256 を含める

最近の Windows は高DPIなので重要です。



PNG 圧縮を使う

Vista 以降の ICO は PNG を内部に入れられます。

上のコードは PNG 内包型です。



小サイズ用に別デザインを作る

16x16 用は:

  • 文字を減らす
  • 太線にする
  • 単純化する

と見やすくなります。



さらに高度なこと

C# では:

  • EXE からアイコン抽出
  • DLL のアイコン取得
  • Shell アイコン取得
  • ファイル関連付けアイコン生成

などもできます。

例えば:

Icon.ExtractAssociatedIcon(path)

で EXE のアイコン取得ができます。