スポンサーリンク

| キーワード:

libwebpを使ってみる(Encode , Lossy)

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);

}

コメントを残す

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

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


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