5 个版本 (3 个重大更新)

0.4.0 2024 年 6 月 25 日
0.3.0 2024 年 5 月 1 日
0.2.0 2024 年 1 月 4 日
0.1.1 2023 年 3 月 27 日
0.1.0 2022 年 4 月 29 日

#113 in 图像

每月 25 次下载

MIT/Apache

7MB
798

包含 (静态库,2MB) libdownsample_ispcx86_64-unknown-linux-musl.a,(静态库,1.5MB) downsample_ispcx86_64-pc-windows-msvc.lib,(静态库,2MB) libdownsample_ispcx86_64-unknown-linux-gnu.a,(静态库,535KB) libdownsample_ispcx86_64-apple-darwin.a,(静态库,310KB) libdownsample_ispcaarch64-linux-android.a,(静态库,310KB) libdownsample_ispcaarch64-unknown-linux-gnu.a 以及 更多.

使用 Lanczos 过滤器的 ISPC 图像下采样器

CI Latest version Docs MIT APACHE2 Contributor Covenant

Banner

关于

此 crate 通过使用 ISPC 实现快速图像下采样。为了保留图像的清晰度,使用 Lanczos 过滤器。

该 crate 将 2048x2048 的图像下采样到 512x512,耗时约 1.2 秒,而其他测试的 crate 耗时超过 4 秒。

该 crate 提供了 Windows、Linux 和 macOS 的 ISPC 函数绑定和预编译库,因此不需要 ISPC 编译器和 libclang,除非您想使用不同的设置重新构建它们。为此,请使用 cargo build --features=ispc。这将要求您在全局 PATH 变量中拥有 ISPC 编译器。

使用方法

从纹理像素的切片、源图像的尺寸和格式中创建一个新的 ispc_downsampler::Image。目前仅支持 RGB8 和 RGBA8 纹理。使用源图像和目标图像的缩放尺寸调用 ispc_downsampler::downsample。函数将返回一个与源图像相同格式的 Vec<u8>,包含下采样图像的像素。

示例

use image::{io::Reader, RgbaImage};
use ispc_downsampler::{downsample, Format, Image};
use std::path::Path;
use std::time::Instant;

fn main() {
    // Load the image using the `image` crate
    let loaded_img = Reader::open(Path::new("test_assets/square_test.png"))
        .expect("Failed to open image file")
        .decode()
        .expect("Failed to decode loaded image");

    // Get the image data as an RGBA8 image for testing purposes.
    let img_rgba8 = loaded_img.into_rgba8();
    let img_size = img_rgba8.dimensions();

    // Create the source image for the downsampler
    let src_img = Image::new(
        &*img_rgba8,       // The image's pixels as a slice
        img_size.0 as u32, // Source image width
        img_size.1 as u32, // Source image height
        Format::RGBA8,     // Source image format
    );

    let target_width = (img_size.0 / 4) as u32;
    let target_height = (img_size.1 / 4) as u32;

    let now = Instant::now();
    println!("Downsampling started!");
    let downsampled_pixels = downsample(&src_img, target_width, target_height);
    println!("Finished downsampling in {:.2?}!", now.elapsed());

    // Save the downsampled image to an image for comparison
    std::fs::create_dir_all("example_outputs").unwrap();
    let save_image = RgbaImage::from_vec(target_width, target_height, downsampled_pixels).unwrap();
    save_image
        .save("example_outputs/square_test_result.png")
        .unwrap();
}

依赖项