スポンサーリンク

skia(1) vcpkgで導入して試す

skiaを使いたいがビルドに失敗するので妥協してvcpkgで導入してとにかく使う。

vcpkg

適当なディレクトリからgit cloneした後、bootstrap-vcpkg.batを実行。

git clone https://github.com/microsoft/vcpkg
cd vcpkg
bootstrap-vcpkg.bat

skiaの導入

導入はinstallコマンドで行う。ビルド等が行われた後、includeディレクトリなどが packages\skia_x64-windows\ に入っている。

vcpkg install skia
vcpkg\packages\skia_x64-windows\

サンプルコード

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

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

#include <cstdio>
#include <vector>

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


#pragma warning(disable:4996)

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

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

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

int main()
{
    
    // skiaの設定
SkBitmap bitmap; bitmap.setInfo(SkImageInfo::MakeN32Premul(400, 400)); bitmap.allocPixels(); SkCanvas canvas(bitmap); // 図形の描画 SkPaint paint; paint.setStyle(SkPaint::kStroke_Style); paint.setStrokeWidth(5); paint.setColor(SK_ColorRED); canvas.drawCircle(200, 200, 100, paint);

    // canvasのバッファへアクセス
    SkImageInfo info = bitmap.info();
    unsigned char* pixels = (unsigned char* )bitmap.getPixels(); // 画像データの先頭アドレス
    size_t rowBytes = bitmap.rowBytes(); // 1行のバイト数
    // チャンネル数
    int channels = info.bytesPerPixel();
    // 画像サイズ
    int width = info.width();
    int height = info.height();

printf("channels %d\n", channels);
 

      
    // PPMへ出力
std::vector<unsigned char> ppm(width * height * 3); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { size_t pos_ppm = (i * width + j) * 3; size_t pos_sk = (i * rowBytes + j * channels); ppm[pos_ppm + 0] = pixels[pos_sk + 2]; ppm[pos_ppm + 1] = pixels[pos_sk + 1]; ppm[pos_ppm + 2] = pixels[pos_sk + 0]; } } pnmP3_Write("output.ppm", width, height, ppm.data());

}

結果

雑談

実は一年くらい公式のビルド方法を試して失敗している。もういい。

コメントを残す

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

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


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