26 个版本 (3 个稳定版)
2.0.0-beta | 2024 年 8 月 2 日 |
---|---|
1.0.2 | 2024 年 4 月 9 日 |
1.0.1 | 2024 年 3 月 30 日 |
1.0.0-alpha | 2023 年 12 月 29 日 |
0.1.0-alpha.4 | 2023 年 7 月 27 日 |
#42 在 配置
1,143 每月下载量
145KB
3.5K SLoC
甘氨酸
甘氨酸允许将图像解码为 gdk::Texture
并提取图像元数据。解码发生在沙盒化的模块化 图像加载器 中。
- 甘氨酸 – Rust 图像库
- libglycin – 库的 C 绑定
- libglycin-gtk4 – 将 glycin 帧转换为 GDK Textures 的 C 绑定
- glycin-utils – 用于编写 glycin 加载器的实用程序
- 加载器 – 几种格式的 glycin 加载器
示例
let file = gio::File::for_path("image.jpg");
let image = Loader::new(file).load().await?;
let height = image.info().height;
let texture = image.next_frame().await?.texture;
局限性
甘氨酸基于 memfds、unix 套接字和 linux 命名空间等技术。它目前仅在 Linux 上运行。可以通过不使用沙盒机制来将其用于其他类 Unix 系统。目前没有计划支持 Windows,并且可能不可行。
图像加载器配置
加载器配置从 XDG_DATA_DIRS
和 XDG_DATA_HOME
读取。位置通常是
<data-dir>/share/glycin/<compat-version>+/conf.d/<loader-name>.conf
例如
<data-dir>/share/glycin/0+/conf.d/glyicn-image-rs.conf
配置是 glib KeyFiles 形式的
[loader:image/png]
Exec = /usr/libexec/glycin/1+/glycin-image-rs
其中 loader
之后的部分是 MIME 类型,而 Exec
的值可以是任何可执行路径。
现有兼容性版本
并非每个库的新主要版本都需要与加载器破坏兼容性。如果 glycin 版本 X 破坏了兼容性,则新的兼容性版本将称为 X+。只有 glycin X 和更新的版本将与 X+ 兼容,直到使用新的兼容性版本。每个兼容性版本的 API 定义可在 docs/
中找到。以下是一些当前存在的兼容性版本
兼容性版本 | 兼容性 |
---|---|
0+ | glycin 0.x |
1+ | 甘氨酸 1.x, lib甘氨酸 1.x |
支持的图像格式
以下特性由loaders目录中提供的甘氨酸加载器支持。
格式 | 解码器 | ICC | CICP | EXIF | XMP | 动画 | 库 |
---|---|---|---|---|---|---|---|
AVIF | heif | ✔ | ✔ | ✔ | ✘ | ✘ | libheif-rs + libheif (C++) |
BMP | image-rs | ✘ | — | — | — | — | image-rs |
DDS | image-rs | — | — | — | — | — | image-rs |
farbfeld | 无MIME类型 | — | — | — | — | — | image-rs |
QOI | image-rs | — | — | — | — | — | image-rs |
GIF | image-rs | ✘ | — | — | ✘ | ✔ | image-rs |
HEIC | heif | ✔ | ✔ | ✔ | ✘ | ✘ | libheif-rs + libheif (C++) |
ICO | image-rs | — | — | — | — | — | image-rs |
JPEG | image-rs | ✔ | — | ✔ | ✘ | — | image-rs |
JPEG XL | jxl | ✔ | ✘ | ✔ | ✘ | ✘ | jpegxl-rs + libjxl (C++) |
OpenEXR | image-rs | — | — | — | — | — | image-rs |
PNG | image-rs | ✔ | ✘ | ✔ | ✘ | ✔ | image-rs |
PNM | image-rs | — | — | — | — | — | image-rs |
SVG | image-rs | ✘ | — | — | ✘ | — | librsvg + gio/cairo (C) |
TGA | image-rs | — | — | — | — | — | image-rs |
TIFF | image-rs | ✔ | — | ✔ | ✘ | — | image-rs |
WEBP | image-rs | ✔ | — | ✔ | ✘ | ✔ | image-rs |
符号 | 含义 |
---|---|
✔ | 支持 |
✘ | 格式支持但尚未实现 |
— | 此格式不可用 |
沙箱和内部机制
甘氨酸为每个图像文件启动一个进程。甘氨酸与加载器之间的通信通过Unix套接字上的对等点对点D-Bus进行。
甘氨酸在Flatpak内外都支持沙箱机制。在Flatpak外部,使用以下机制:通过bwrap
启动图像加载器二进制文件。bubblewrap配置仅允许与宿主系统的最小交互。仅挂载必要的文件系统部分,并且只提供读访问权限。没有直接的网络访问。不将环境变量传递到沙箱中。在派生进程之前,通过调用setrlimit
限制内存使用,并通过seccomp过滤器将系统调用限制为允许列表。
在Flatpak内部,使用flatpak-spawn --sandbox
命令。这以类似直接调用bwrap
的方式限制对文件系统的访问。通过将加载器调用包装在prlimit
命令中来限制内存使用。不对现有的Flatpak seccomp规则应用额外的seccomp过滤器。
通过Unix套接字将GFile内容流式传输到加载器。这样,加载器可以加载需要网络访问的内容,而它们自己不直接拥有网络访问权限。例如,SVG格式在它们的配置中将ExposeBaseDir = true
选项设置为true。这将导致将原始图像文件的目录挂载到沙箱中,以包括来自那里的外部图像文件。对于flatpak-spawn
沙箱,ExposeBaseDir
选项没有效果,因为它们不支持此功能。
加载器通过甘氨酸密封的memfd提供纹理数据,然后将其作为mmap提供给GDK。对于动画和SVG,沙箱进程保持活动状态,直到需要新的帧或瓦片。
有关如何实现加载器的信息,请参阅glycin-utils
文档。
构建和测试
-Dloaders
选项允许仅构建某些加载器。-Dtest_skip_ext
选项允许在测试期间跳过某些图像文件扩展名。如果x265不可用,可能需要选项-Dtest_skip_ext=heic
。- 运行集成测试需要安装甘氨酸加载器。默认情况下,
meson test
会创建一个单独的安装环境,测试将在该环境中运行。通过设置-Dtest_skip_install=true
,可以将此行为更改,需要在运行测试之前手动调用meson install
。 glycin
库中有一个示例,glycin-render
,它将加载作为参数传递的图像并将其渲染为当前目录中的 PNG 文件output.png
。
打包
分发需要将加载器二进制文件及其配置独立于应用程序打包。加载器通过 meson 构建并安装。
应用程序将依赖于 glycin
库来使用已安装的二进制加载器。
许可证
SPDX-License-Identifier: MPL-2.0 OR LGPL-2.1-or-later
依赖项
~16–28MB
~481K SLoC