私はCで物理実験に取り組んでいます Youngの干渉実験 とfile
に印刷するプログラムを作成しました:
for (i=0; i < width*width; i++)
{
fwrite(hue(raster_matrix[i]), 1, 3, file);
}
hue
に値[0..255]が与えられた場合、char *
3バイト、R、G、B。
この生ファイルをvalidイメージファイルにするために、イメージファイルに最小限のヘッダーを配置したいと思います。
より簡潔:からの切り替え:
offset
0000 : height * width : data } my data, 24bit RGB pixels
に
offset
0000 : dword : magic \
: /* ?? */ \
0012 : dword : height } Header <--> common image file
0016 : dword : width /
: /* ?? */ /
0040 : height * width : data } my data, 24bit RGB pixels
ありがとうございました。
おそらく PPM形式 を使用することをお勧めします。これは、探しているものです。最小限のヘッダーの後に生のRGBが続きます。
最近作成された farbfeld 形式は非常に最小限ですが、それをサポートするソフトウェアはあまりありません(少なくとも今のところ)。
Bytes │ Description
8 │ "farbfeld" magic value
4 │ 32-Bit BE unsigned integer (width)
4 │ 32-Bit BE unsigned integer (height)
(2+2+2+2)*width*height │ 4*16-Bit BE unsigned integers [RGBA] / pixel, row-major
[〜#〜] targa [〜#〜] (ファイル名拡張子.tga
)は、圧縮を使用せず、その拡張子も使用しない場合、最もシンプルで広くサポートされているバイナリイメージファイル形式です。 Windowsよりもさらに簡単です.bmp
ファイル。ImageMagickおよび多くのペイントプログラムでサポートされています。使い捨てプログラムからいくつかのピクセルを出力する必要があるとき、それは私の頼りになるフォーマットでした。
以下は、標準出力に画像を生成する最小限のCプログラムです。
#include <stdio.h>
#include <string.h>
enum { width = 550, height = 400 };
int main(void) {
static unsigned char pixels[width * height * 3];
static unsigned char tga[18];
unsigned char *p;
size_t x, y;
p = pixels;
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
*p++ = 255 * ((float)y / height);
*p++ = 255 * ((float)x / width);
*p++ = 255 * ((float)y / height);
}
}
tga[2] = 2;
tga[12] = 255 & width;
tga[13] = 255 & (width >> 8);
tga[14] = 255 & height;
tga[15] = 255 & (height >> 8);
tga[16] = 24;
tga[17] = 32;
return !((1 == fwrite(tga, sizeof(tga), 1, stdout)) &&
(1 == fwrite(pixels, sizeof(pixels), 1, stdout)));
}
最小限のPPMヘッダーで画像ファイルを書き込む最小限の例は次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <math.h> // compile with gcc -lm
#define WAVE(x,y) sin(sqrt( (x)*(x)+(y)*(y) ) / 3.0)
int main(){
/* Setup code */
#define width 256
unsigned char raster_matrix[width*width];
unsigned char a[3];
#define hue(c) (a[0] = c, a[1] = 128, a[2] = 255-c, a)
int x, y, i = 0;
for (y = 0; y < width; y++) for (x = 0; x < width; x++)
raster_matrix[i++] = 128 + 64*(WAVE(x,y) + WAVE(x,width-y));
/* Open PPM File */
FILE *file = fopen("young.ppm", "wb"); if (!file) return -1;
/* Write PPM Header */
fprintf(file, "P6 %d %d %d\n", width, width, 255); /* width, height, maxval */
/* Write Image Data */
for (i=0; i < width*width; i++)
fwrite(hue(raster_matrix[i]), 1, 3, file);
/* Close PPM File */
fclose(file);
/* All done */
return 0;
}
http://netpbm.sourceforge.net/doc/ppm.html の仕様に基づいてヘッダーコードを書きました。
質問で指定されたfor
ループを組み込むことができるように、いくつかのセットアップコードをハッキングしました。 :)