スポンサーリンク

skia(2)Skiaでpng保存。あとJpeg,webp。

SkiaでPng保存するには、SkPngEncorder.hとSkStream.hをインクルードし、SkPngEncoder::Optionsで圧縮などの設定、SkFILEWStream でファイルストリーム作成、SkPngEncoder::Encodeで書き込みを行う。

#pragma comment(lib,"skia.dll.lib")

#include "skia/include/core/SkCanvas.h"

// SkBitmap
#include "skia/include/core/SkBitmap.h"

// Png保存に必要
#include "skia/include/encode/SkPngEncoder.h"
#include "skia/include/core/SkStream.h"

#include <cstdio>
#include <vector>

// 必要なDLL
// skia.dll
// jpeg62.dll
// zlib1.dll


#pragma warning(disable:4996)


int main()
{
    
    //////////////////////////////////////////////////////
    SkBitmap bitmap;
    bitmap.setInfo(SkImageInfo::MakeN32Premul(400, 400));
    bitmap.allocPixels();
    SkCanvas canvas(bitmap);
    // 背景を白にクリア
    canvas.clear(SK_ColorWHITE);
    // 図形の描画
    SkPaint paint;
    paint.setStyle(SkPaint::kStroke_Style);
    paint.setStrokeWidth(5);
    paint.setColor(SK_ColorRED);
    canvas.drawCircle(200, 200, 100, paint);
    //////////////////////////////////////////////////////

    // optionsの設定
    SkPngEncoder::Options options;
    options.fZLibLevel = 9; // 圧縮レベル
    options.fFilterFlags = SkPngEncoder::FilterFlag::kAll; // フィルタの種類


    SkImageInfo info = bitmap.info();
    unsigned char* pixels = (unsigned char*)bitmap.getPixels(); // 画像データの先頭アドレス
    size_t rowBytes = bitmap.rowBytes(); // 1行のバイト数

    // bitmapをファイル保存
    SkPixmap pixmap(info, pixels, rowBytes);
    SkFILEWStream stream("output.png");
    SkPngEncoder::Encode(& stream, pixmap, options);

    return 0;
}

Jpeg

Jpegの場合はSkJpegEncoder.hをインクルードする。

#include "skia/include/encode/SkJpegEncoder.h"

後はほぼ同じ。ただしoptionsの指定内容はJpeg用になっている。

    SkJpegEncoder::Options options;
    options.fQuality = 100; // 画質
    SkImageInfo info = bitmap.info();
    unsigned char* pixels = (unsigned char*)bitmap.getPixels(); // 画像データの先頭アドレス
    size_t rowBytes = bitmap.rowBytes(); // 1行のバイト数

    // bitmapをファイル保存
    SkPixmap pixmap(info, pixels, rowBytes);
    SkFILEWStream stream("output.jpg");
    SkJpegEncoder::Encode(&stream, pixmap, options);

Webp

Webpの場合はSkWebpEncoder.hをインクルードする。

#include "skia/include/encode/SkWebpEncoder.h"

Webpは非可逆圧縮なのでjpegと同じようにfQualityがある。

    SkWebpEncoder::Options options;
    options.fQuality = 100; // 画質
    SkImageInfo info = bitmap.info();
    unsigned char* pixels = (unsigned char*)bitmap.getPixels(); // 画像データの先頭アドレス
    size_t rowBytes = bitmap.rowBytes(); // 1行のバイト数

    // bitmapをファイル保存
    SkPixmap pixmap(info, pixels, rowBytes);
    SkFILEWStream stream("output.jpg");
    SkWebpEncoder::Encode(&stream, pixmap, options);

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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


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