スポンサーリンク

| キーワード:

libwebpを使ってみる(Decode)

デコード。webpファイルを読み込み、ppmファイルに変換する。なおアルファ付き画像は扱わない。

#include <fstream>

#include "ppmP3_read.hpp"

#include <vector>

#include <webp/decode.h>

#pragma comment(lib,"libwebp.lib")



void ppmP3_write(
  const char* const fname,
  const int width,
  const int height,
  const unsigned char* const p,
  const int vmax
);


int main()
{
  // ファイルの画像の格納先
  std::vector<std::uint8_t> image;

  ///////////////////////////////////
  // webp形式の画像データをファイルから読み込む
  std::ifstream ifs(
    "C:\\test\\a.webp", 
    std::ios::binary);
  ifs.seekg(0, std::ios::end);
  long long int size = ifs.tellg();
  ifs.seekg(0);

  // ファイル読み込み
  image.resize(size);
  ifs.read((char*)image.data(), size);

  //ファイルのデータサイズ
  const size_t datasize = image.size();
  ///////////////////////////////////

  // 画像データの情報の格納先
  int width;
  int height;
  uint8_t* rgb = nullptr;

  // 画像情報を取得する構造体
  WebPBitstreamFeatures info;

  // 画像情報を取得
  WebPGetFeatures(
    image.data(),
    datasize,
    &info
  );
  ///////////////////////////////////
  // 画像情報を表示
  printf("alpha   : %s\n", info.has_alpha?"true":"false");
  printf("format  : %s\n",
    (info.format == 0) ? "undefined":
    ((info.format == 1) ? "lossy" : "lossless"));
  printf("animation:%s\n", info.has_animation ? "true" : "false");
  ///////////////////////////////////

  if (info.has_alpha != 0) {

    // WebPDecodeRGBA でRGBAのデータ列に変換
  }
  else {

    // RGBのデータ列に変換。戻り値がRGGデータ
    rgb = WebPDecodeRGB(
      image.data(),
      datasize,
      &width,
      &height
    );
  }
  ///////////////////////////////////

  ppmP3_write("C:\\test\\fromwebp.ppm",
    width, height,
    rgb,
    255);


      
  // libWebPが確保したメモリの解放
  WebPFree(rgb);
}

//! @brief PPM(RGB各1byte,カラー,テキスト)を書き込む
//! @param [in] fname ファイル名
//! @param [in] width 画像の幅
//! @param [in] height 画像の高さ
//! @param [in] p 画像のメモリへのアドレス
//! @param [in] vmax 全てのRGBの中の最大値。普通の画像なら255
//! @details RGBRGBRGB....のメモリを渡すと、RGBテキストでファイル名fnameで書き込む
void ppmP3_write(
  const char* const fname,
  const int width,
  const int height,
  const unsigned char* const p,
  const int vmax
) {

  FILE* fp = fopen(fname, "wb");
  fprintf(fp, "P3\n%d %d\n%d\n", width, height, vmax);

  size_t k = 0;
  for (size_t i = 0; i < (size_t)height; i++) {
    for (size_t j = 0; j < (size_t)width; j++) {
      fprintf(fp, "%d %d %d ",
        p[k * 3 + 0],
        p[k * 3 + 1],
        p[k * 3 + 2]
      );
      k++;
    }
    fprintf(fp, "\n");
  }

  fclose(fp);
}

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: