< 返回版块

eruca 发表于 2024-05-05 00:30

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 执行。

``

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]

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页