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