43

私はCで物理実験、ヤングの干渉実験fileに取り組んでおり、大量のピクセルに印刷するプログラムを作成しました。

for (i=0; i < width*width; i++)
{
    fwrite(hue(raster_matrix[i]), 1, 3, file);
}

ここhueで、値 [0..255] を指定するchar *と、R、G、B の 3 バイトの a が返されます。

この生ファイルを有効な画像ファイルにするために、画像ファイルに最小限のヘッダーを入れたいと思います。

より簡潔に、次から切り替えます。

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
4

4 に答える 4

48

探しているものであるPPM 形式を使用することをお勧めします: 最小限のヘッダーの後に生の RGB が続きます。

于 2013-05-19T15:38:49.750 に答える
8

最近作成された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
于 2016-03-11T17:38:08.647 に答える
4

最小限の PPM ヘッダーを使用して画像ファイルを書き込む最小限の例を次に示します。幸いなことに、あなたが提供した正確な for ループで動作させることができました:

#include <math.h> // compile with gcc young.c -lm
#include <stdio.h>
#include <stdlib.h>

#define width 256

int main(){
    int x, y, i; unsigned char raster_matrix[width*width], h[256][3];
    #define WAVE(x,y) sin(sqrt( (x)*(x)+(y)*(y) ) * 30.0 / width)
    #define hue(i) h[i]

    /* Setup nice hue palette */
    for (i = 0; i <= 85; i++){
        h[i][0] = h[i+85][1] = h[i+170][2] = (i <= 42)? 255:    40+(85-i)*5;
        h[i][1] = h[i+85][2] = h[i+170][0] = (i <= 42)? 40+i*5: 255;
        h[i][2] = h[i+85][0] = h[i+170][1] = 40;
    }

    /* Setup Young's Interference image */
    for (i = 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の仕様に基づいています。この画像の場合、ヘッダーは 15 バイトの文字列です: "P6 256 256 255\n".

于 2019-01-03T14:46:35.793 に答える