C言語からgnuplotを操作する
C言語からgnuplotを操作して、グラフを描きます。
#include <stdio.h>
#include <stdlib.h>
#define GNUPLOT_PATH "/usr/local/bin/gnuplot"
int main(int argc, const char *argv[]) {
FILE *gp;
gp = popen(GNUPLOT_PATH, "w");
if (gp == NULL) {
fprintf(stderr, "%s: No such file.", GNUPLOT_PATH);
exit(1);
}
fprintf(gp, "plot sin(x)\n");
fflush(gp);
fprintf(gp, "pause 3\n");
//sleep(3000);
//getchar();
pclose(gp);
return 0;
}
C言語からgnuplotを操作する(バイナリデータを読み込んで描画)
C言語からgnuplotを操作して、バイナリで書き出したデータを、読み込んでグラフを描きます。
#include <stdio.h>
#include <stdlib.h>
#define GNUPLOT_PATH "/usr/local/bin/gnuplot"
int main(int argc, const char *argv[])
{
int i;
double data[256];
FILE *fp, *gp;
for (i = 0; i < 256; i++) {
data[i] = 2.0 * ((double)rand() / (double)RAND_MAX) - 1.0;
}
if ((fp = fopen("data.dat", "w")) == NULL) {
fprintf(stderr, "Can't open!\n");
exit(1);
}
fwrite(data, sizeof(double), 256, fp);
fflush(fp); // バッファフラッシュする
fclose(fp);
gp = popen(GNUPLOT_PATH, "w");
if (gp == NULL) {
exit(1);
}
fprintf(gp, "set term pdf\n");
fprintf(gp, "set output \"data.pdf\"\n");
fprintf(gp, "plot \"data.dat\" binary array=256 format=\"%%double\" with lines\n");
fflush(gp); // ファイルに出力する場合は不要?
pclose(gp);
return 0;
}
ファイルサイズを調べる
開いたファイルのサイズを調べます。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[]) {
//size_t file_size;
fpos_t file_size;
char ifn[FILENAME_MAX];
FILE *fp;
/* Input file name */
if (argc > 1) {
strcpy(ifn, argv[1]);
} else {
printf("Input File Name : ");
scanf("%s", ifn);
}
/* File open */
if ((fp = fopen(ifn, "r")) == NULL) {
fprintf(stderr, "%s: No such file.", ifn);
exit(1);
}
fseek(fp, 0L, SEEK_END);
//file_size = ftell(fp);
fgetpos(fp, &file_size);
fseek(fp, 0L, SEEK_SET);
fclose(fp);
fprintf(stdout, "%ld Byte\n", (long)file_size);
return 0;
}
PNM形式の画像を出力する
グレースケールとカラーのランダムパターンをPNM形式で出力します。
P1(PBM) | アスキー | 2値画像 |
P2(PGM) | アスキー | グレースケール |
P3(PPM) | アスキー | カラー |
P4(PBM) | バイナリ | 2値画像 |
P5(PGM) | バイナリ | グレースケール |
P6(PPM) | バイナリ | カラー |
#include <stdio.h>
#define WIDTH 64
#define HEIGHT 64
int main(int argc, char *argv[])
{
int x, y;
unsigned char image_buf[HEIGHT][WIDTH][3];
FILE *fp;
for (y = 0; y < HEIGHT; y++) {
for (x = 0; x < WIDTH; x++) {
image_buf[y][x][0] = rand() % 255; // R
image_buf[y][x][1] = rand() % 255; // G
image_buf[y][x][2] = rand() % 255; // B
}
}
/* Grayscale Image - ASCII */
fp = fopen("ascii.pgm", "wt");
fprintf(fp, "P2\n%d %d\n%d\n", WIDTH, HEIGHT, 255);
for (y = 0; y < HEIGHT; y++) {
for (x = 0; x < WIDTH; x++) {
fprintf(fp, "%d ", image_buf[y][x][0]);
}
fprintf(fp, "\n");
}
fclose(fp);
/* Color Image - Binary */
fp = fopen("binary.ppm", "w");
fprintf(fp, "P6\n%d %d\n%d\n", WIDTH, HEIGHT, 255);
fwrite(image_buf, sizeof(unsigned char), WIDTH * HEIGHT * 3, fp);
fclose(fp);
return 0;
}
小ネタ
●与えられたサイズ以上で最小の2のべき乗となる値を求めます。
#include <math.h>
pow(2.0, ceil(log2((double)N)));
●メモリ確保とエラー処理。
unsigned char *image1, *image2;
image1 = (unsigned char *)malloc(sizeof(unsigned char) * width * height);
image2 = (unsigned char *)malloc(sizeof(unsigned char) * width * height);
if (image1 == NULL || image2 == NULL) {
fprintf(stderr, "Unable to allocate image buffer.\n");
exit(1);
}