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 次下载
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 图像下采样器
关于
此 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();
}