2019/08/19

GDグラフィックライブラリ(GD Graphics Library)の使い方

C言語でpng画像を生成したいと思い、その方法を調査したので備忘録として以下に示します。


試験環境


いつもの如くOSはdebianを使用します。


GDグラフィックライブラリとは


- Wikipediaより抜粋

GDグラフィックライブラリ(GD Graphics Library)はトーマス・ボーテル(Thomas Boutell)他によって作られたイメージを動的に操作するライブラリである。本来のプログラミング言語はANSI Cであるが、他の多くのプログラミング言語とのインタフェースが作成されている。GIF、JPEG、PNG、WBMP を生成できる。


インストール方法


debian環境では、以下のコマンドでインストールできます。

# apt update
# apt install libgd-dev

サンプルプログラム


256x256ピクセルのpng画像を生成します。ピクセル毎に着色し、赤成分を横方向に0から255まで、緑成分を縦方向に0から255まで変化させます。


リスト1(main.c)
#include <stdio.h>
#include <gd.h>

int main() {
  gdImagePtr im;
  FILE *pngout;

  int x, y;

  im = gdImageCreateTrueColor(256, 256);

  for (x = 0; x < 256; x++) {
    for (y = 0; y < 256; y++) {
      gdImageSetPixel(im, x, y, (x << 16) + (y << 8));
    }
  }

  pngout = fopen("test.png", "wb");
  gdImagePng(im, pngout);
  fclose(pngout);
  gdImageDestroy(im);

  return 0;
}

GDグラフィックライブラリ関数の仕様はこちらを参照ください。


リスト2 コンパイル&実行
$ cc -o ex1 -lgd -O3 -Wall main.c
$ ./ex1

図1 実行結果(test.png)

2019/08/18

C言語とgnuplotでマンデルブロ集合を表示する(2)

本稿は、以前投稿した「C言語とgnuplotでマンデルブロ集合を表示する」のCソースの一部を複素数型に変更したものです。

gnuplotを使うと結構簡単にマンデルブロ集合を表示することができます。OSはdebianを使用しています。
今回は、複素数型の変数を宣言して計算しています。複素数型の変数を使うとCコードがより簡潔になります。

リスト1 mandelblot.c
/*
  マンデルブロ集合計算プログラム
*/
#include <stdio.h>
#include <math.h>
#include <complex.h>

#define C0r     -0.743  // 計算する場所の中心座標(実数部)
#define C0i      0.1145 // 計算する場所の中心座標(虚数部)
#define VS       0.003  // 計算する場所の中心座標からの範囲(±VS)

#define NMAX     3000   // 計算の繰り返し上限
#define STEP     1600   // 計算する刻み

// "Coloring Dynamical Systems in the Complex Plane"
// http://math.unipa.it/~grim/Jbarrallo.PDF


float mandelbrot(const double complex c) {
  double complex z;
  int n;

  z = c;
  for (n = 0; n < NMAX; ++n) {
    //    if (cabs(z) > 2) { // より簡潔な記法(ただし遅い)
    if (creal(z) * creal(z) + cimag(z) * cimag(z) > 4) {
      return (n - (logf(logf(cabsf(z))) / logf(2))); // 発散
    }
    z = z * z + c;
  }
  return 0; // 計算の繰り返し上限到達
}

int main() {
  double a, b;

  for (a = C0r - VS; a < C0r + VS; a += 2 * VS / STEP) {
    for (b = C0i - VS; b < C0i + VS; b += 2 * VS / STEP) {
      printf("%e %e %e\n", a, b, mandelbrot(a + b * I) / NMAX);
    }
    printf("\n"); // これがないとgnuplotでエラーが出る
  }
  return 0;
}

リスト2 png.gnuplot (gnuplot実行スクリプト)
set term png size 900, 900
set output "mandelbrot.png"
set grid
set pm3d map
set size ratio -1
unset colorbox
unset key
set title 'Mandelbrot set'
set xlabel 'Re'
set ylabel 'Im'
set palette defined (0 "#000000", 1 "#d00000", 5 "#e0e000", 9 "#ffffff")
splot "data.txt"

リスト3 コンパイル&実行
$ cc -o mandelbrot -lm -O4 -Wall mandelbrot.c
$ ./mandelbrot > data.txt
$ gnuplot png.gnuplot

【補足】gnuplotがないと言われる場合は、下記手順でインストールしてください。
# apt update
# apt install gnuplot

図1 実行結果(mandelbrot.png)

【備忘録】時系列データの編集方法(R言語, tidyverse)

TimeSeries.knit 1 サンプルデータ作成 2 日付単位に集計する 2.1 月毎集計 2.2 四半期毎集計 ...