web-dev-qa-db-ja.com

最も単純なRGB画像形式とは何ですか?

私は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

ありがとうございました。

35
Nope

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

34

最近作成された 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
3
Ian D. Scott

[〜#〜] 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)));
}
2
Lassi

最小限の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ループを組み込むことができるように、いくつかのセットアップコードをハッキングしました。 :)

0
mwfearnley