inflate

inflateで、解凍(展開・復元)をする。

zlib Home Site
zlib 1.2.11 Manual
zlib 入門

前回Deflate圧縮したjpeg_start_compress.c.zを元に戻してみる。

前回のdeflateに代わり、inflateを使う。

$ vi main.c
$ ls
jpeg_start_compress.c.z  main.c
$ gcc main.c -o main -lz
$ ls
jpeg_start_compress.c.z  main  main.c
$ ls -al
合計 36
drwxrwxr-x. 2 bg1 bg1  4096 xx月 xx xx:xx .
drwxrwxr-x. 3 bg1 bg1  4096 xx月 xx xx:xx ..
-rw-rw-r--. 1 bg1 bg1  1573 xx月 xx xx:xx jpeg_start_compress.c.z
-rwxrwxr-x. 1 bg1 bg1 18616 xx月 xx xx:xx main
-rw-rw-r--. 1 bg1 bg1  3750 xx月 xx xx:xx main.c
$ ./main
$ ls -al
合計 44
drwxrwxr-x. 2 bg1 bg1  4096 xx月 xx xx:xx .
drwxrwxr-x. 3 bg1 bg1  4096 xx月 xx xx:xx ..
-rw-rw-r--. 1 bg1 bg1  4197 xx月 xx xx:xx jpeg_start_compress.c.txt
-rw-rw-r--. 1 bg1 bg1  1573 xx月 xx xx:xx jpeg_start_compress.c.z
-rwxrwxr-x. 1 bg1 bg1 18616 xx月 xx xx:xx main
-rw-rw-r--. 1 bg1 bg1  3750 xx月 xx xx:xx main.c
$ cat jpeg_start_compress.c.txt
/* ヘッダファイルのインクルード */
/* 既定のヘッダファイル */
#include <stdio.h> /* 標準入出力 */
#include <stdlib.h> /* 標準ユーティリティ */
#include <jpeglib.h> /* libjpeg */
/* 独自のヘッダファイル */
#include "bitmap.h" /* ビットマップ */

/* main関数の定義 */
int main(void){

  /* 変数の宣言 */
  bitmap_t bitmap = {0}; /* bitmap_t型bitmapを0で初期化. */
  struct jpeg_compress_struct cinfo; /* Jpeg圧縮情報cinfo. */
  struct jpeg_error_mgr jerr; /* Jpegエラー処理jerr. */
  FILE *fp = NULL; /* Jpegファイルのファイルポインタfp. */
  JSAMPROW line_buffer = NULL; /* 行バッファline_buffer. */
  JSAMPROW p = NULL; /* 書き込み位置 */
  int x = 0; /* 列 */
  int y = 0; /* 行 */
  int padding = 0; /* ワード境界により起きるパディング数. */

  /* ビットマップのロード */
  load_bitmap("test.bmp", &bitmap); /* load_bitmapで"test.bmp"をロード. */

  /* Jpegエラー処理の初期化 */
  cinfo.err = jpeg_std_error(&jerr); /* jpeg_std_errorでjerrを初期化して, 戻り値はcinfo.errに格納. */

  /* Jpegファイルを開く */
  fp = fopen("test.jpg", "wb"); /* fopenで"test.jpg"をバイナリ書き込みで開く. */
  if (fp != NULL){ /* fpがNULLでなければ. */

    /* Jpegオブジェクトの初期化 */
    jpeg_create_compress(&cinfo); /* jpeg_create_compressでcinfoを生成&初期化. */

    /* ファイルポインタのセット */
    jpeg_stdio_dest(&cinfo, fp); /* jpeg_stdio_destで出力先をfpにする. */

    /* パラメータ設定 */
    cinfo.image_width = bitmap.info_header.width; /* 幅はbitmap.info_header.width. */
    cinfo.image_height = bitmap.info_header.height; /* 高さはbitmap.info_header.height. */
    cinfo.input_components = bitmap.info_header.bit_count / 8; /* 色数はbitmap.info_header.bit_count / 8. */
    cinfo.in_color_space = JCS_RGB; /* カラースペースはRGB. */

    /* デフォルトとして設定 */
    jpeg_set_defaults(&cinfo); /* jpeg_set_defaultsでcinfoをデフォルト設定としてセット. */

    /* 画質の設定 */
    jpeg_set_quality(&cinfo, 50, TRUE); /* jpeg_set_qualityで画質を50%にセット. */

    /* パディング計算 */
    padding = (cinfo.input_components * cinfo.image_width) % 4; /* ワード境界によって余ったpaddingを計算. */

    /* 行バッファの確保 */
    line_buffer = malloc(sizeof(JSAMPLE) * cinfo.input_components * cinfo.image_width); /* mallocで行バッ
ファ確保. */

    /* 圧縮開始 */
    jpeg_start_compress(&cinfo, TRUE); /* jpeg_start_compressで圧縮開始. */

    /* ピクセルバッファの受け渡し */
    for (y = cinfo.image_height - 1; y >= 0; y--){ /* cinfo.image_heightの分だけ繰り返す.(上下逆なので注意.) */
      p = line_buffer; /* line_bufferをpにセット. */
      for (x = 0; x < cinfo.image_width; x++){ /* cinfo.image_widthの分だけ繰り返す. */
        /* BMPは実際にはBGRの順にならんでいるんで注意. */
        *p = bitmap.buf[x * 3 + 2 + y * (cinfo.input_components * cinfo.image_width + padding)]; /* r */
        p++; /* pを1つ移動. */
        *p = bitmap.buf[x * 3 + 1 + y * (cinfo.input_components * cinfo.image_width + padding)]; /* g */
        p++; /* pを1つ移動. */
        *p = bitmap.buf[x * 3 + y * (cinfo.input_components * cinfo.image_width + padding)]; /* b */
        p++; /* pを1つ移動. */
      }
      jpeg_write_scanlines(&cinfo, &line_buffer, 1); /* jpeg_write_scanlinesで行を書き込む. */
    }
   
    /* 圧縮終了 */
    jpeg_finish_compress(&cinfo); /* jpeg_finish_compressで圧縮終了 */

    /* 行バッファの破棄 */
    free(line_buffer); /* freeで行バッファを破棄. */

    /* Jpeg圧縮情報cinfoの破棄 */
    jpeg_destroy_compress(&cinfo); /* jpeg_destroy_compressでcinfoを破棄. */

    /* ファイルを閉じる */
    fclose(fp); /* fcloseでファイルを閉じる. */

  }

  /* ビットマップの破棄. */
  destroy_bitmap(&bitmap); /* destroy_bitmapでbitmapを破棄. */

  /* プログラムの終了 */
  return 0;

}
$

復元できた。

Sample/zlib/inflate/inflate/src/inflate at master · bg1bgst333/Sample · GitHub