スポンサーリンク
libwebpを使ってみる(Encode , Lossless)
小規模な画像をLossyで保存すると色がかなり悲惨なことになる(QualityFactor==100.0でも)。
なのでテストのため少し大きめのPPMを読み込んで変換する。
#include "ppmP3_read.hpp" #include <vector> #include <webp/encode.h> #pragma comment(lib,"libwebp.lib") // https://suzulang.com/ppmp3_read-memalloc-ver/ #include "ppmP3_read.hpp" // https://www.study.suzulang.com/2dcg-functions/nbyte-data-type #include "NByteData.hpp" int main() { using PixelT = NByteData<3>; std::vector<PixelT> rgbdata; // 画像読み込み int width; int height; int vmax; // rgb画像読み込み ppmP3_read( "C:\\data\\b.ppm", &width, &height, &vmax, [&rgbdata](const size_t pixelcount) { rgbdata.resize(pixelcount); return (unsigned char*)&rgbdata[0]; } ); // 非可逆圧縮の品質 0.0f ~ 100.0f float quality_factor = 50.0f; uint8_t* output = 0; // 非可逆圧縮 size_t size = WebPEncodeRGB( rgbdata.data()->data(), width, height, width * 3, // stride 一行のメモリサイズ quality_factor, // 品質 &output ); printf("%zu", size); FILE* fp = fopen("C:\\data\\test-lossy-rgb.webp", "wb"); fwrite(output, 1, size, fp); fclose(fp); WebPFree(output); }