0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

C++ や Python のプログラミング学習で「Hello World」を終えた後、教科書通りに if 文やループ処理の文法を延々と学ぶのは、少し退屈に感じることがあります。そこで今回は、ファイル操作や外部ライブラリの導入も一切なしで、使い慣れた print(標準出力)の知識だけで「ブラウザで開けるきれいな画像ファイル」を生成する手順をご紹介します。

ステップ 1 では「シンプルな四角形」、ステップ 2 では「プログラミングの力を使った美しいグラデーション」を作ります。

仕組み:標準出力とリダイレクト

プログラムが画面に文字を出す仕組みを「標準出力」と呼びます。通常はコマンドプロンプトやターミナルの画面に文字が流れるだけですが、実行時に > という記号(リダイレクト機能)を使うことで、その文字をそのままファイルに書き込むことができます。

今回は、Web ブラウザが直接解釈して画像として描画できる SVG(Scalable Vector Graphics) フォーマットのテキストデータをプログラムから出力し、それをファイル化します。

仕様を極限までスッキリさせるため、今回は以下の工夫を施しています。

  • 属性値の囲みをシングルクォーテーション(')にしています
  • 現代のブラウザは先頭の <svg> タグだけで自動認識するため、 XML 宣言は省略しています

ステップ 1:まずは基本の図形を描いてみる

最初のステップとして、「スカイブルーの四角形」を1つ描画するシンプルなコードから。

C++ 版のコード

#include <iostream>

int main()
{
//  std::cout << "<?xml version='1.0' encoding='UTF-8'?>\n" ;
    std::cout << "<svg width='200' height='200' viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'>\n" ;
    std::cout << "    <rect x='20' y='20' width='160' height='100' fill='skyblue' stroke='black' stroke-width='2' />\n" ;
    std::cout << "    </svg>\n" ;

    return 0 ;
    }

Python 版のコード

def main():
    print("<svg width='200' height='200' viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'>")
    print("    <rect x='20' y='20' width='160' height='100' fill='skyblue' stroke='black' stroke-width='2' />")
    print("    </svg>")

if __name__ == "__main__":
    main()

動かし方の解説

実行コマンド:
どちらの言語でも、OS のリダイレクト機能(>)を使えば同じような SVG ファイルが作成されます。
C++ の場合: main.exe > rect.svg
Python の場合: python main.py > rect.svg

生成された rect.svg を、普段使っている Web ブラウザにドラッグ&ドロップしてみてください。きれいな空色の四角形が表示されます。


ステップ 2:プログラミングの力で「グラデーション」を作る

単一の四角形を出すだけなら、手書きで SVG ファイルを作っても同じです。しかし、プログラミングの本領はここからです。

次は for 文によるループ処理と計算を組み合わせることで、「赤から緑へとなめらかに変化する、美しいグラデーション画像」を生成してみます。

svg_line_r_g.png

C++ 版のコード(グラデーション)

#include    <iostream>

int    main    ()
{
    std::cout << "<svg width='256' height='200' viewBox='0 0 256 200' xmlns='http://www.w3.org/2000/svg'>\n" ;
    for (int i = 0 ; i < 256 ; i++) {
        int r = 255 - i ;  // red
        int g = i ;        // green
        int b = 0 ;
        int x = i ;
        std::cout   << "    <line  x1='"  << x
                    << "' y1='0' x2='"    << x
                    << "' y2='"           << 200
                    << "' stroke='rgb("
                    << r << "," << g << "," << b
                    << ")' stroke-width='1' />\n" ;
        }
    std::cout << "    </svg>\n" ;
    return    0 ;
    }

Python 版のコード(グラデーション)

def main():
    print("<svg width='256' height='200' viewBox='0 0 256 200' xmlns='http://www.w3.org/2000/svg'>")
    for i in range(256):
        r = 255 - i  # red
        g = i        # green
        b = 0
        x = i
        print(f"    <line x1='{x}' y1='0' x2='{x}' y2='200' stroke='rgb({r},{g},{b})' stroke-width='1' />")
    print("    </svg>")

if __name__ == "__main__":
    main()

同じようにリダイレクト機能を使って grad.svg などのファイル名で保存し、ブラウザで開いてみてください。ループカウンタ i の変化に合わせて、線の位置(x)が右に移動しながら、同時に赤(r)が減り、緑(g)が増えていくという動作が確認できます。


おわりに

ファイルの入出力やグラフィックの文法を本格的に学ぶ前でも、アイデア次第でここまで面白い成果物を作ることができます。


さらに深く学びたい方へ(参考リンク):

  • 初心者のためのSVG (Scalable Vector Graphics) 入門 - Qiita
    circle(円)や line(直線)など、SVG で使える基本図形の書き方がチートシートとして綺麗にまとまっています。これらも同じように printstd::cout で出力すれば、ループ処理を使って様々な幾何学図形を自動生成できます!

実際にこの標準出力グラフィックのロジックを Synology NAS の CGI 環境や、PHP 環境での動作などについては、以下のブログ記事に記述しています。


※ 本記事の構成および文章の作成には、生成 AI を利用しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?