【Rust日报】2024-05-04 Image库发布 v0.25: 性能改进,生产就绪的WebP

2024-05-10 16:48:53 浏览数 (2)

Image crate是 Rust 最受欢迎的图像处理库,现已发布新版本!它为各种图像格式带来了加速和其他增强功能。

JPEG格式

此版本从jpeg-decoder切换到 zune-jpeg crate 以解码 JPEG 图像。这带来了巨大的性能改进。

zune-jpeg的性能与 libjpeg-turbo, 不相上下,libjpeg-turbo 是一个经过广泛优化的库,其中的汇编比 C 语言多,在纯 Rust 中匹配这种性能是一项了不起的成就!

由于这一变化,不再支持几乎只用于医学成像的晦涩难懂的“无损 JPEG”格式。如果您需要处理无损 JPEG,我们建议直接使用 jpeg-decoder。

此更改还允许对内存限制提供适当的支持。 jpeg-decoder 可以分配可能无限的内存量,同时 zune-jpeg 允许设置内存限制。

PNG 格式

png 板条箱的性能有所提高,这在很大程度上要归功于在 Chromium 中将其用于 PNG 解码的持续努力。

为了实现它, png crate 不仅需要和 libpng 一样快(已经有一段时间了),而且还需要匹配 Chromium 的 SIMD 优化分叉的速度 libpng 。我们正在取得良好的进展,并且非常接近!

其中一项优化(对没有透明度的图像进行 Paeth 取消过滤)需要显式 SIMD,并且无法通过自动矢量化实现。为了避免引入 unsafe 代码,它是使用可移植 SIMD API 实现的。如果您需要最佳性能,请使用夜间编译器和 png 板条箱上的 unstable 功能。

GIF 动图

除了性能改进之外(是的,这里也是 - 而且它已经足够快了!),API 现在允许在动画 GIF 中并行解码和编码帧,让您将性能提升到一个全新的水平。

此版本还具有更低的内存使用率,删除了最后的 unsafe 代码,并通过在帧上 Decoder 实现 Iterator 以及其他增强功能使 API 更加友好。

WebP 网络

纯 Rust WebP 解码器现在可以投入生产了!

一段时间以来,它一直是默认设置, image 但在某些边缘情况下会导致不正确的解码。现在已经在数千张真实世界的图像上进行了测试,所有剩余的分歧都已得到修复。它的输出通常逐位匹配 libwebp

如果您以前因为正确性问题而一直在使用 libwebp ,您现在可以切换到 image-webp 并且再也不必处理在野外利用的破坏性缓冲区溢出!

虽然正确性应该非常好,但解码器的性能仍然不如 libwebp 汇编优化。非常欢迎提高性能的 PR!

在此版本中,有损编码器已依赖 libwebp 并已删除。您仍然可以使用 webp 板条箱对 image 板条箱加载的图像进行编码,请参阅此处。

image 现在还包括一个用于 WebP 的内存安全无损编码器。压缩速度非常快,但生成的文件比创建 libwebp 的文件大(即使它们已经击败了 PNG)。甚至更高的压缩比模式的贡献也将非常受欢迎。

API 更改

在许多解码器上添加了 BufRead Seek 绑定。这使我们能够避免在解码开始之前复制内存中已有的数据,并在将来解锁进一步的优化。

删除了增量解码。只有一小部分解码器支持它。删除它使我们能够使 ImageDecoder 特征对象安全。

For other, relatively minor changes please see the full changelog. 对于其他相对较小的更改,请参阅完整的更改日志。

更多信息查看 GitHub, https://github.com/image-rs/image

rustyscript: Rust中轻松集成JS

这个 crate 旨在提供一种快速简单的方法来从 rust 中集成运行时 javacript 或打字稿组件。 默认情况下,正在运行的代码完全从主机沙盒化,没有文件系统或网络访问权限。支持异步 JS 代码(我建议在创建运行时使用 timeout 选项)。加载的 JS 模块可以导入其他模块。Typescript 默认支持,并将转译为 JS 执行。

``

代码语言:javascript复制
use rustyscript::{json_args, Runtime, Module, Error};

let module = Module::new(
    "test.js",
    "
    rustyscript.register_entrypoint(
        (string, integer) => {
            console.log(`Hello world: string=${string}, integer=${integer}`);
            return 2;
        }
    )
    "
);

let value: usize = Runtime::execute_module(
    &module, vec![],
    Default::default(),
    json_args!("test", 5)
)?;

assert_eq!(value, 2);

rxpipes - 一个 2D 终端屏保

这不是一个非常有用的纳米项目,但仍然比hello world大一点。这是一个“屏幕保护程序”,灵感来自用于终端的 pipes.sh(以及 Windows 的旧屏幕保护程序)。它使用交叉项进行绘图和输入。

特征:

  1. 6 个可用的计件集(或图块集)。
  2. 每个管道都有自己的颜色;可用的调色板包括:无(无色)、基色(由终端主题定义的 16 种颜色)和 RGB。
  3. 多变的FPS。
  4. 可以更改管道的最小和最大长度。
  5. 可以更改绘制的最大字符数。若要忽略此设置,请通过 CLI 指定 0。当达到此数字时,屏幕将被清除。
  6. 转动管道的概率是可变的,它以十进制形式 (0 .. 1) 的百分比给出。
  7. 屏幕保护程序可以通过按空格键暂停,用 q、Q 或转义键关闭。

更多信息查看 GitHub,https://github.com/inunix3/rxpipes

From 日报小组 [倪步烤Neo]

0 人点赞