スポンサーリンク

Rust + tiny-skiaで画像を描画

tiny-skiaはskiaの影響を受けたライブラリで、テキストレンダリングなどの機能を除いて「skiaっぽくつかえる軽量のライブラリ」として開発されている。本家とは関係ない。BSDライセンス。

Cargo.toml

 

[dependencies]
# tiny-skiaの使用。
# https://crates.io/crates/tiny-skia/
tiny-skia = "0.11"

# 乱数を使用 https://crates.io/crates/rand
rand = "0.8.5"

 

サンプルコード

※コード中の「skia」は全てtiny-skiaの意味。

use rand::Rng;// 乱数用
use tiny_skia::{Pixmap, Paint, Color,  PathBuilder, Transform};

fn main() {

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

    // skiaの画像を作成
    let mut skiaimage = Pixmap::new(width,height).expect("skia error");

    // イテレータ経由でピクセルバッファへアクセス
    // 全ての画素を緑で塗りつぶし
    let mut pixel_itr = skiaimage.data_mut().chunks_exact_mut(4);
    for pixel in pixel_itr{
        pixel[0] = 0;
        pixel[1] = 255; // 緑
        pixel[2] = 0;
        pixel[3] = 255;
    }

    // tiny-skiaで円を描く
    circle(&mut skiaimage,200.0,200.0,100.0,0,0,255);
    circle(&mut skiaimage,130.0,250.0,80.0,255,0,0);

    let mut rng = rand::thread_rng(); // 乱数を使用

    // ランダムアクセス
    // スライスの配列を作成してアクセスするので、使い回さないのなら効率が悪い
    let mut pixels: Vec<&mut [u8]> = skiaimage.data_mut().chunks_exact_mut(4).collect();
    (0..50000).for_each(|_|{
        let x:u32=rng.gen_range(0 ..width as i32) as u32;
        let y:u32=rng.gen_range(0 .. height as i32) as u32;

        let pos = (y*width+x) as usize;
        pixels[pos][0] =255;
        pixels[pos][1] =255;
        pixels[pos][2] =255;
        pixels[pos][3] =255;

    });

    // 結果をPNGに保存
    skiaimage.save_png("output.png").expect("Failed to save PNG");
    println!("Image saved as output.png");

}

      
fn circle(simg:&mut Pixmap,px:f32,py:f32,radius:f32,r:u8,g:u8,b:u8){

    // 塗りつぶしの色を設定
    let mut paint = Paint::default();
    paint.set_color(Color::from_rgba8(r,g,b, 255));

    // パス作成
    let mut path_builder = PathBuilder::new();
    path_builder.push_circle(px,py,radius);
    let path = path_builder.finish().expect("Failed to create path");

    // 円を描画
    simg.fill_path(
        &path,
        &paint,
        tiny_skia::FillRule::Winding,
        Transform::identity(),
        None,
    );
}

コメントを残す

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

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


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