Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

PGM形式で画像を書き込むCプログラム


PGMはポータブルグレーマップです。 2D配列をPNG、JPEG、またはその他の画像形式の画像としてCに保存する場合は、ファイルに書き込む前に、指定された形式でデータをエンコードするために多くの作業を行う必要があります。

Netpbm形式は、簡単でポータブルなソリューションを提供します。 Netpbmはグラフィックプログラムのオープンソースパッケージであり、基本的にLinuxまたはUnixプラットフォームで使用されます。 MicrosoftWindowsシステムでも動作します。

各ファイルは2バイトのマジックナンバーで始まります。このマジックナンバーは、ファイルのタイプを識別するために使用されます。タイプは、PBM、PGM、PPMなどです。また、エンコーディング(ASCIIまたはバイナリ)も識別します。マジックナンバーは大文字のPとそれに続く1桁の数字です。

ASCIIエンコーディングにより、人間が読みやすく、他のプラットフォームに簡単に転送できます。バイナリ形式はファイルサイズがより効率的ですが、ネイティブのバイト順序の問題がある可能性があります。

PGMファイルの書き方は?

  • 魔法の数P2を設定します
  • 空白を追加する(スペース、タブ、CR、LF)
  • 10進数のASCII文字としてフォーマットされた幅を追加
  • 空白を追加
  • 高さを追加し、10進数のASCII文字としてフォーマットします
  • 空白を追加
  • 最大のグレー値をASCII10進数で入力します
  • 空白を追加
  • 幅x高さのグレー値。それぞれASCII10進数(0から最大値までの範囲)で、上から下に空白で区切られます。

サンプルコード

#include <stdio.h>
main() {
   int i, j;
   int w = 13, h = 13;
   // This 2D array will be converted into an image The size is 13 x 13
   int image[13][13] = {
      { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 },
      { 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31},
      { 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47},
      { 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63},
      { 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79},
      { 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95 },
      { 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111},
      { 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127},
      { 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143},
      { 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159},
      { 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175},
      { 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191},
      { 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207}
   };
   FILE* pgmimg;
   pgmimg = fopen("my_pgmimg.pgm", "wb"); //write the file in binary mode
   fprintf(pgmimg, "P2\n"); // Writing Magic Number to the File
   fprintf(pgmimg, "%d %d\n", w, h); // Writing Width and Height into the
   file
   fprintf(pgmimg, "255\n"); // Writing the maximum gray value
   int count = 0;
   for (i = 0; i < h; i++) {
      for (j = 0; j < w; j++) {
         fprintf(pgmimg, "%d ", image[i][j]); //Copy gray value from
         array to file
      }
      fprintf(pgmimg, "\n");
   }
   fclose(pgmimg);
}

PGM画像は以下のようになります

出力

PGM形式で画像を書き込むCプログラム


  1. ポインタの例を示すCプログラムを作成する

    ポインタは、別の変数のアドレスを格納する変数です。 ポインタの機能 ポインタはメモリスペースを節約します。 メモリ位置に直接アクセスできるため、ポインタの実行時間が短縮されます。 ポインタを使用すると、メモリに効率的にアクセスできます。つまり、メモリは動的に割り当てられ、割り当てが解除されます。 ポインタはデータ構造で使用されます。 ポインタの宣言 int *p; これは、「p」が別の整数変数のアドレスを保持するポインタ変数であることを意味します。 ポインタの初期化 アドレス演算子(&)は、ポインタ変数を初期化するために使用されます。 たとえば、 int qt

  2. 配列を逆にするCプログラムを書く

    配列は、共通の名前で保存される関連アイテムのグループです。 構文 配列を宣言するための構文は次のとおりです- datatype array_name [size]; 初期化 配列は宣言時に初期化することもできます- int a[5] = { 10,20,30,40,50}; Cの逆配列 スワッピング手法を使用して配列を逆にすることができます。 たとえば、「P」が4つの要素を持つ整数の配列である場合- P[0] = 1, P[1] = 2, P[2] = 3 and P[3]=4 次に、反転した後- P[0] = 4, P[1] = 3, P[2] = 2 and P[3]=1