スポンサーリンク

Rust+ skia-safeで画像描画

skia-safeはSkiaのRustバインディング(非公式)。厳密にはskia-bindingというバインディングがあり、それをRustらしく使えるようにしたのがskia-safe。

Cargo.toml

[dependencies]
# Skiaの使用。
# https://crates.io/crates/skia-safe
skia-safe = "0.80"

サンプルコード

use std::fs::File;
use std::io::BufWriter;

fn main() {

    let width:u32 = 400;
    let height:u32 = 400;

    //(C++) SkBitmap bitmap;
    let mut bitmap = skia_safe::Bitmap::new();

    //(C++) bitmap.setInfo(SkImageInfo::MakeN32Premul(400, 400));
    let info = skia_safe::ImageInfo::new(
        (400,400),
        skia_safe::ColorType::N32,
        skia_safe::AlphaType::Premul,
        None
    );
    bitmap.set_info(&info,None);

    //(C++) bitmap.allocPixels();
    bitmap.alloc_pixels();

    //(C++) SkCanvas canvas(bitmap);
    let mut canvas:skia_safe::OwnedCanvas = skia_safe::Canvas::from_bitmap(&bitmap,None).unwrap();

    // bitmapの情報を表示
    dispinfo(&bitmap);

    // 描画呼び出し
    draw(&mut canvas);


    //(C++) SkPngEncoder::Options options;
    //(C++) options.fZLibLevel = 9; // 圧縮レベル
    //(C++) options.fFilterFlags = SkPngEncoder::FilterFlag::kAll; // フィルタの種類
    let mut opt = skia_safe::png_encoder::Options::default();
    opt.z_lib_level = 9;
    opt.filter_flags = skia_safe::png_encoder::FilterFlag::ALL;
    opt.comments = vec![];

    // ファイル出力
    let file = File::create("out.png").unwrap();
    let mut writer = BufWriter::new(file);
    let png_data = skia_safe::png_encoder::encode(&bitmap.pixmap(),&mut writer,&opt);

}

fn draw(canvas:&mut skia_safe::OwnedCanvas){

    //(C++) SkPaint paint;
    let mut paint: skia_safe::Paint = skia_safe::Paint::new(skia_safe::colors::BLACK,None);

    //(C++) paint.setStyle(SkPaint::kStroke_Style);
    paint.set_style(skia_safe::PaintStyle::Stroke);

    //(C++) paint.setStrokeWidth(5);
    paint.set_stroke_width(5.0);

    //(C++) paint.setColor(SK_ColorRED);
    paint.set_color(skia_safe::Color::RED);

    //(C++) canvas.drawCircle(200, 200, 100, paint);
    // (200,200) はタプル
    canvas.draw_circle((200,200),100.0,&paint);

}

fn dispinfo(bitmap :&skia_safe::Bitmap) {
    let info = &bitmap.info();

    let rowbytes = bitmap.row_bytes();
    let channel = info.bytes_per_pixel();
    let width = info.width();
    let height = info.height();

    println!("rowbytes:{}\nchannel:{}\nwidth:{}\nheight{}",rowbytes,channel,width,height);

}

コメントを残す

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

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


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