#image #convert-images #sdf #gamedev #vector #vector-graphics

距离场

从图像生成距离场,以进行伪矢量渲染

11 个版本

0.2.1 2024 年 2 月 9 日
0.2.0 2022 年 10 月 10 日
0.1.8 2022 年 10 月 9 日
0.1.7 2019 年 7 月 29 日
0.1.5 2017 年 12 月 28 日

#46渲染

Download history 66/week @ 2024-07-28

66 每月下载量
用于 omt

GPL-3.0 许可证

29KB
83 代码行

distance-field

Build Status Crates.io Documentation License: GPL-3.0 Downloads

文档

生成用于在着色器中渲染为伪矢量图像的距离场位图。

该库的一个示例用途是将资产图像自动转换为距离场。你可以通过以下类似的 build.rs 实现此功能

use std::fs::File;
use distance_field::DistanceFieldExt;

fn convert_image_to_dfield(input: &str, output: &str) {
    // Load the 'input' image
    let img = image::open(input).unwrap();

    // Generate a distance field from the image
    let outbuf = img.grayscale().distance_field(distance_field::Options {
        size: (128, 128),
        max_distance: 256,
        ..Default::default()
    });

    // Save it to 'output' as a PNG
    image::DynamicImage::ImageLuma8(outbuf).save(output).unwrap();
}

fn main() {
    convert_image_to_dfield("img/input.png", "output.png");
}

生成器二进制文件

检出仓库并 cd 进入它;然后运行

cargo run --example generator -- img/input.png output.png 64 64

这将以下图像作为输入

Rust logo

并生成一个 64x64 的距离场

Distance field

现在我们可以使用生成的距离场来创建矢量图像。

使用距离场

首先我们需要通过线性插值将其放大

Upscaled linear

然后我们应用一个阈值函数

Treshold

你可以看到,我们得到了与原始输入图像非常相似的东西,而且只是从一个 64x64 的图像中得到的!但它仍然非常像素化,看起来不像矢量图像。这可以通过不执行硬阈值而是允许一些灰色调来修复。

依赖关系

~6MB
~83K SLoC