デコード。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); }